こんにちは!
rsync の進行状況を追跡することで、PyGTK プログレス バーを機能させようとしています。rsyncするには、commands.getstatusoutputを使用しています。
rsync の進行状況を追跡して PyGTK 進行状況バーに表示する方法を知っている人はいますか?
ありがとうございました!
こんにちは!
rsync の進行状況を追跡することで、PyGTK プログレス バーを機能させようとしています。rsyncするには、commands.getstatusoutputを使用しています。
rsync の進行状況を追跡して PyGTK 進行状況バーに表示する方法を知っている人はいますか?
ありがとうございました!
commands.getstatusoutput は、ステータス バーに電力を供給するために必要な増分出力を提供しません。rsync から出力を読み取る他の方法を見てください。
rsync の進行状況をプログラムで追跡する方法は実際には存在しないため、出力を「スクリーン スクレイピング」し、何らかの方法でその進行状況を「推測」することをお勧めします。
最初に行うべきことは、rsync の stdout をスクレイピングしてその進行状況を追跡する画面をより詳細に制御できるようになるため、subprocess
代わりに使用することです。commands.getstatusoutput
解決策の 1 つは、rsync を-v
オプション付きで実行することです。これにより、転送された各ファイルの後に改行が続きます (さらに、実際には必要のないその他のお粗末なものも含まれます)。rsync の進行状況を推測する簡単な方法は、次のようにすることです。
import subprocess
p = subprocess.Popen(['rsync', '-v', ..other rsync args..], shell=True,
stdout=subprocess.PIPE, close_fds=True)
while p.stdout.readline():
...
# rsync has just "completed" an operation, i.e. it probably
# transferred a file. now would be a good time to update the
# ProgressBar. there are some options here, see below...
...
ret = p.wait()
print "Rsync exited with code %d" % ret
rsync -v ...
これにより、一度に1 行の出力が読み取られ、while
ループ内で必要に応じて更新ProgressBar
されます。質問は、どのような更新ですか? ProgressBar
実際には 2 つのモードがあります。1 つは不確定な目標に向かって進行状況を示す「ピン」を前後に送信するモードで、もう 1 つは既知の目標に向けた増分に基づいてバーを左から右に移動するモードです。
--list-only
rsync が転送するファイルの数を事前に (またはを使用して)ファイル リストを取得して「推測」し、-vn
それを目標として使用することもできますが、送信者のファイル リストが変更されるリスクがあるため、これは本質的にエラーが発生しやすくなります。リストを収集してから実際にrsyncを実行するまでの間。より良い解決策は、ループ内で呼び出しpulse()
て、バックグラウンドで処理が行われていることを示すことです。より多くの情報を表示したい場合は、出力を読んでどこかを更新し、どのファイルが転送されているかを示すことができます。ProgressBar
while
p.stdout.readline()
gtk.Label
(注: 上記のコードは、rsync を実行するときのエラー状態を考慮していません。おそらくそうするべきです)