3

(ウィンドウズ)

プログラム SoX (サブプロセス モジュール) を呼び出す Python コードをいくつか書きました。このプログラムは、指定した場合に STDERR で進行状況を出力します。出力からパーセンテージステータスを取得したい。Python スクリプトからではなく呼び出すと、すぐに開始され、100% までスムーズに進行します。

Pythonスクリプトから呼び出すと、開始するまで数秒続き、その後、遅い出力と速い出力を交互に繰り返します。私は char ごとに char を読みますが、大きなブロックが突進することがあります。ですから、他の時間にキャラクターが1人ずつ増えていくのを見ることができる理由がわかりません. (ちなみに、私のテストでは 15KiB のデータが生成されます。)

mkvmerge と mkvextract で同じことをテストしました。パーセンテージも出力します。STDOUT の読み取りはスムーズです。

これはとても頼りにならない!sox の stderr ストリームの読み取りをスムーズにし、おそらく最初の遅延を防ぐにはどうすればよいですか?


私が電話して読む方法:

process = subprocess.Popen('sox_call_dummy.bat', stderr = subprocess.PIPE, stdout = subprocess.PIPE)
while True:
    char = process.stderr.read(1).encode('string-escape')
    sys.stdout.write(char)
4

1 に答える 1

1

この密接に関連するスレッドに従って: Python でサブプロセスを使用してプロセスからのバッファリングされていない読み取り

process = subprocess.Popen('sox_call_dummy.bat', 
                stderr = subprocess.PIPE, bufsize=0)
while True:
    line = process.stderr.readline()
    if not line: 
        break
    print line

あなたは stdout を読んでいないので、パイプは必要ないと思います。

元の例のように char ごとに読み取りを試みたい場合は、毎回フラッシュを追加してみてください。

sys.stdout.write(char)
sys.stdout.flush()

書き込むたびに stdout をフラッシュすることは、Python プロセスのバッファリングを無効にすること、 python.exe -u <script>または env 変数を設定することと同等です。PYTHONUNBUFFERED=1

于 2012-04-14T02:20:36.930 に答える