0

私の問題はこれです-サブプロセスから出力を取得する必要があり、それを呼び出すために次のコードを使用しています-(長い引数は無視してください。インポートするのはstdout = subprocess.PIPEです)

        (stdout, stderr) = subprocess.Popen([self.ChapterToolPath, "-x",  book.xmlPath , "-a", book.aacPath , "-o",   book.outputPath+ "/" + fileName + ".m4b"], stdout= subprocess.PIPE).communicate()
        print stdout

以下の回答のおかげで、プログラムの出力を取得することができましたが、それでも、何かを取得する前にプロセスが終了するのを待つことになります。興味深いのは、私のデバッガーでは、コンソールにあらゆる種類のテキストが飛んでいて、それがすべて無視されていることです。しかし、何かが黒でコンソールに書き込まれる瞬間(私はpycharmを使用しています)、プログラムは問題なく続行されます。メインプログラムは、先に進むために何らかの出力を待っている可能性がありますか?私はそれと通信しようとしているので、これは理にかなっています....コンソールに表示されるテキストとstdoutに到達する実際のテキストに違いはありますか?そして、コンソールに書き込まれたテキストをどのように収集しますか?

ありがとう!

4

2 に答える 2

2

のドキュメントsubprocess.call()の最初の行は、次のように説明しています。

args で記述されたコマンドを実行します。コマンドが完了するのを待ってから、returncode 属性を返します。

したがって、必然的にサブプロセスが終了するのを待ちます。

subprocess.Popen()対照的に、 はこれを行わず、プロセスのハンドルを返しcommunicate()ます。

于 2012-07-31T15:24:51.773 に答える
1

プログラムからすべての出力を取得するには:

from subprocess import check_output as qx

output = qx([program, arg1, arg2, ...])

プログラムの実行中に出力を取得するには:

from subprocess import Popen, PIPE

p = Popen([program, arg1, ...], stdout=PIPE)
for line in iter(p.stdout.readline, ''):
    print line,

program' インタラクティブに実行すると行ごとに出力されるが、サブプロセスとして実行すると出力がバッファリングされる場合は、バッファリングの問題が発生する可能性があります。OS またはプログラムに応じてさまざまな解決策があります。たとえば、pexpect moduleを使用して実行できます。

于 2012-07-31T16:38:43.043 に答える