2011-11-10 14 views
14

多くの出力を生成するコマンドラインを実行するときに、サブプロセス、サブプロセス、またはサブプロセスを使用すると問題が発生します。奇妙なことに、しばらく待ってから、スクリプトがぶら下がっている状態で、cmd行でコマンドされたジョブが完了し、スクリプトだけがハングアップしていることがわかりました。Python:subprocess.Popenとsubprocess.callがハングします

subprocess.call(cmd, shell = True) 
#OR 
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) 
# HANGS HERE 
print "show something after subprocess" 

最後の印刷は実行されませんが、実際にはcmdが実行されています。

また、cmdはシリアルポートに関連しているので、シリアルケーブルを抜くとすべてが正常になり、最後のprintetetementが実行されます。しかし、私がターミナルを使用するときは、シリアルが接続されていてもすべてがうまくいけば、それはpythonスクリプトでのみ発生します。

どうもありがとうPythonドキュメントによると

答えて

12

は、subprocess.callは、コマンドを実行してその終了を待ち、それはPopen.wait続いsubprocess.Popenに相当します。

しかし、Popen.waitメソッドのドキュメントでは、バッファオーバーフローの問題について明示的に警告し、Popen.communicateを代わりに使用することを推奨しています。したがって、あなたが探している解決策のようなものでなければなりません:あなたの最初の行は動作しない理由を

import subprocess 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
stdout, stderr = process.communicate() 
print "show something after subprocess" 
+1

OPがそうでない 'subprocess.PIPE'を使わない場合、' subprocess.call'を使っても問題ありません。 – interjay

+1

'print'ステートメントの出力が親に表示されない理由は説明しません。 'Popen()'は、フルバッファでパイプに書き込むために子プロセスがブロックされていても、子プロセスを待つことはありません。 – jfs

2

私は理解していない - 何stdin/stdout/stderrリダイレクトがないよう、必要はありませんブロッキングのために。

第1パイプが読み取られるwothoutを保持することができるよりも、STDINまたは

  • 介しプロセス

    1. を期待データはstdoutに、より多くのデータを送信する場合にブロックするようになっています。

    しかし、あなたのサブプロセスが正しく終了するので、ブロックする理由もわかりません。それが本当に終わると確信していますか?

  • 関連する問題