6

rsyncオプション付きの開発版を使用してい--info-progressます。rsyncを使用してサーバーからローカルコンピューターにファイルを転送するpythonプログラムを作成しています:

finalresult = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', 'hostname:/filename', '/home/nfs/django/user'],
                                    stdout=subprocess.PIPE).communicate()[0]

ターミナルでプログラムを実行しても進行状況は表示されませんが、rsync ユーティリティを単独で使用すると進行状況が表示されます。ターミナルで進行状況を確認し、進行状況のパーセンテージを解析または取得して、後で使用して進行状況バーをリアルタイムでユーザーに表示したいと考えています。ありがとうございました!

編集: これは私がこれまでに試したことです:上記のコードは、コマンド処理をfinalresult変数に格納します。django テンプレートで変数を印刷しようとしfinalresultましたが、何も返されません。

4

1 に答える 1

2

subprocess申し訳ありませんが、それはおそらく、標準ライブラリの残りの部分でも行うこともできません。そして、それはsubprocess.communicate()あなたが見つけるからです:

def wait(self):
   """Wait for child process to terminate.  Returns returncode
   attribute."""
   if self.returncode is None:
      # Try calling a function os.waitpid(self.pid, 0)
      # Ignore Interrupted System Call (errno.EINTR) errors  
      pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
      self._handle_exitstatus(sts)
   return self.returncode

Unix では、os.waitpid() 関数呼び出しは次のことを意味します。プロセス ID pid で指定された子プロセスの完了を待ち、そのプロセス ID と終了ステータス表示を含むタプルを返します。したがって、子プロセスが終了するまで待つ必要があります。

最も近い代替手段はpexpectですが、それでも進行状況バーの分析は行われません。考えられる解決策は、rsync をハッキングし、その進行状況出力にパッチを当てて、pexpect が動作するようにすることです。

于 2012-11-28T06:29:47.870 に答える