1

改行を新しい行に変換できます。ただし、問題は、ほぼ「リアルタイム」で実行することです。プログレス バーの値だけが 0 と 100 の場合、見た目が非常にばかげています :-)

このコードはすぐに出力を返します。

import subprocess

p = subprocess.Popen(['mplayer', '/home/user/sample.mkv'], stdout=subprocess.PIPE).communicate()[0]
for line in p.splitlines():
    if line.strip():
        print line
4

4 に答える 4

2

Windows以外の場所でのpexpect、およびWindowsでのwexpect、「バッファリングを無効にし」、サブプロセスの出力を「ほぼリアルタイムで」読み取る必要がある場合に常に推奨されます。実行しているサブプロセスは、端末に出力するときと他の何かに出力するときで出力をバッファリングする可能性が高いため(Cランタイムライブラリの通常の動作であるため)、端末に出力していると信じ込ませる必要があります。あなたのプログラムよりも、それが達成されます(下位レベルのモジュールpexpectを介して疑似端末を構築することによって)。pty私は実際wexpect、Windowsでもほとんど同じことができたことに驚いていますが、時には不完全ですが、機能しているようにも見えます;-)。

于 2009-09-28T15:04:19.877 に答える
1

私の経験では、あなたはバッファリングで苦痛の世界にいます。その理由は、標準 C ライブラリが stdout が端末に接続されていないことを検出し、より多くのバッファリングを使用するためです。のソースをハックする以外に、それについてできることは何もありませんmplayer

ただし、 python-pexpectを使用すると、C ライブラリが端末と見なす疑似 tty を使用してサブプロセスが開始され、バッファリングがリセットされません。

この種のことを行うと、サブプロセスのデッドロックを非常に簡単に作成できますが、これは python-pexpect が克服する別の問題です。

于 2009-09-28T13:07:28.367 に答える
0

わかりました、ありがとう!私は pexpect を監視します。しかし、それを行うcosplatformの方法があることがわかりました:PyQt4とQProcess。すべてのプログラムのソリューションではありませんが、Qt4 フロントエンド アプリケーションには確実に適合します :)

于 2009-10-01T01:20:42.893 に答える
-1

あなたは2つのことをする必要があります:

  1. すべての行の出力をフラッシュすることを確認する必要がありますmplayer(同じ行に出力される進行状況の出力で発生するはずです)。

  2. 出力を1行ずつ読み取る必要があります。を呼び出す代わりにcommunicate()、を閉じてからEOFまでp.stdin読み取る必要があります。p.stdout

于 2009-09-28T11:26:35.287 に答える