5

rsyncプロトコルを使用してサーバーからローカルマシンにファイルを転送するPython/Djangoアプリケーションを作成しています。大きなファイルを処理するため、プログレスバーは必須です。コマンド--progressの引数はこれを美しく行います。rsync詳細な進捗状況はすべてターミナルに表示されます。Webブラウザでその進捗状況を表示するにはどうすればよいですか?フック機能などはありますか?または、進行状況をログファイルに保存し、それを呼び出して1分ごとに更新することはできますか?

4

1 に答える 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 に答える