38

subprocess.callそのため、Pythonスクリプトを続行する前にコマンドが終了するのを待っている間に、。を除いてstdoutを取得する方法がないことに気付きましたsubprocess.Popen。終了するまで待機する代替関数呼び出しはありますか?(私も試しましたPopen.wait

os.system注:電話を避けようとしています

result = subprocess.Popen([commands...,
                        self.tmpfile.path()], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = result.communicate()
print out+"HIHIHI"

私の出力:

HIHIHI

注:私はwineこれで実行しようとしています。

4

5 に答える 5

86

避けたいかもしれませんが、私は次の構成を使用していますshell=True。これにより、任意のコマンドの出力とエラー メッセージ、およびエラー コードも得られます。

process = subprocess.Popen(cmd, shell=True,
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.PIPE)

# wait for the process to terminate
out, err = process.communicate()
errcode = process.returncode
于 2012-11-15T13:22:20.403 に答える
21
subprocess.check_output(...)

プロセスを呼び出し、そのエラー コードがゼロ以外の場合は発生し、それ以外の場合はその stdout を返します。簡単な省略形なので、 s などについて心配する必要はありませんPIPE

于 2012-11-15T13:31:25.683 に答える
17

プロセスが大量の stdout を出力し、stderr を出力しcommunicate()ない場合は、メモリの制限により間違った方法である可能性があります。

その代わり、

process = subprocess.Popen(cmd, shell=True,
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.PIPE)

# wait for the process to terminate
for line in process.stdout: do_something(line)
errcode = process.returncode

進むべき道かもしれません。

process.stdout主に、他のそのようなオブジェクトとして扱うことができるファイルのようなオブジェクトです。

  • あなたはread()それからすることができます
  • あなたはreadline()それからすることができます
  • それを繰り返すことができます。

後者は、行ごとにコンテンツを取得するために上記で行ったことです。

于 2012-11-15T13:24:50.667 に答える