rsyncプロトコルを使用してサーバーからローカルマシンにファイルを転送するPython/Djangoアプリケーションを作成しています。大きなファイルを処理するため、プログレスバーは必須です。コマンド--progress
の引数はこれを美しく行います。rsync
詳細な進捗状況はすべてターミナルに表示されます。Webブラウザでその進捗状況を表示するにはどうすればよいですか?フック機能などはありますか?または、進行状況をログファイルに保存し、それを呼び出して1分ごとに更新することはできますか?
質問する
2829 次
1 に答える
5
基本的な原則は、サブプロセスで rsync を実行し、Web API を公開し、javascript を介して更新を取得することです。
これが例です。
import subprocess
import re
import sys
print('Dry run:')
cmd = 'rsync -az --stats --dry-run ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
remainder = proc.communicate()[0]
mn = re.findall(r'Number of files: (\d+)', remainder)
total_files = int(mn[0])
print('Number of files: ' + str(total_files))
print('Real rsync:')
cmd = 'rsync -avz --progress ' + sys.argv[1] + ' ' + sys.argv[2]
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,)
while True:
output = proc.stdout.readline()
if 'to-check' in output:
m = re.findall(r'to-check=(\d+)/(\d+)', output)
progress = (100 * (int(m[0][1]) - int(m[0][0]))) / total_files
sys.stdout.write('\rDone: ' + str(progress) + '%')
sys.stdout.flush()
if int(m[0][0]) == 0:
break
print('\rFinished')
しかし、これは標準出力 ( stdout
) で進行状況を示しているだけです。
ただし、このコードを変更して進行状況を JSON 出力として返すことができます。この出力は、progress webservice/API
作成した を介して利用できるようになります。
クライアント側で使用する場合は、javascript (ajax) を記述progress webservice/API
して随時連絡し、その情報を使用してクライアント側の何か (テキスト メッセージ、画像の幅、div の色など) を更新します。
于 2012-11-23T06:50:27.310 に答える