0

djv_converter 用のシンプルな GUI を作成しています: http://djv.sourceforge.net/documentation.html正常 に動作していますが、Popen で実行すると、このアプリからのフィードバックが不足しています。

args =  [djv_path, newout, "%smov" % moviename,"-speed", speed ,"-scale", scale, "-save",    "quicktime",  "quality", quality, "-save", "quicktime",  "codec", codec, "-channel", channel]

child = subprocess.Popen(args,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

通常、アプリケーションは進行状況をコンソールに出力し、それを使用して進行状況バーを更新します。

問題は、プロセスが終了した後にあらゆる種類の stdout が発生することです。子プロセスを作成する時点でフリーズし、完了するとフリーズを解除するように見えます。通信child.stdout.readの両方を試しましたが、同じことが起こります。

レジストリから呼び出されるバッチ ファイルから Python コードを実行するので、右クリック メニューの下に配置できます。GUI は PySide で書かれています。

また、それが pythonw および .pyw ファイルであろうと、変更された .bat ファイルであろうと、cmd ウィンドウのポップアップを停止できません。

誰かが問題の原因を知っている場合は、私に知らせてください:)

どうもありがとう、KK

4

1 に答える 1

0

問題は、プロセスが終了した後にあらゆる種類の stdout が発生することです。

subprocess.Popenバッファがいっぱいになるまで STDOUT を表示しません。あなたの場合、バッファがいっぱいになることはないため、サブプロセスが完了するまで何も表示されません。

いくつかの提案された推奨事項とともに、このスレッドを参照してください: リアルタイム subprocess.Popen via stdout および PIPE

どの解決策も誰にとっても魔法の弾丸ではないように思われたため、マイレージは異なる場合があります. 個人的にはsubprocess.Popen、バッファリングされていない Python を開くように指示するとうまくいくことがわかりました。

command = ["python", "-u", "python_file.py"]
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

for line in iter(p.stdout.readline, ''):
    line = line.replace('\r', '').replace('\n', '')
    print line
    sys.stdout.flush()
于 2013-06-17T18:22:08.543 に答える