2013-12-08 11 views
5

複合体を提出するcmd実行可能ファイルへの完全なファイルパスで作られた文字列、複数のフラグ、引数、パラメータ、入出力はshell = Trueそうでなければsubprocess.Popen実行可能ファイルへの単純なパス(ファイルパスにスペースを入れない)より複雑なものは理解できません。私の例ではShell = TrueのPythonのSubprocess.Popen。完了するまで待つ

私はかなり長いCMDあります

cmd = " '/Application/MyApp.app/Contents/MacOS/my_executable' '/Path/to/input/files' -some -flags -here -could -be -a -lot '/full/path/to/output/files' " 

はパスして、それを見つけることができないという何かに文句を言いエラーにsubprocess.Popen「結果には、このCMDを送信します。

ので、代わりの使用:

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

check_callを働き非常によく思わ:

proc = subprocess.check_call(cmd, shell=True) 

興味深い、唯一シェル

shell=True 

に供給されたCMDと連携subprocess.check_callに設定されています。

副作用は、subprocess.check_call(cmd、shell = True)が最初に終了するのを待たずに実行されているようです。

コードは、残りの実行がsubprocess.check_call(cmd, shell=True)の結果に依存するように設計されています。

私は、とにかくsubprocess.check_call(cmd、shell = True)が終了するまでコード実行を強制することがあるのだろうかと思います。前もって感謝します!

+0

'shell = False'と' subprocess.Popen'を実行しているときに 'cmd'をリストに変換しようとしましたか? [Popenコンストラクタのドキュメント](http://docs.python.org/2/library/subprocess.html#)にあるサンプルコードのように、 'shlex.split()'関数を使ってそれを行うことができますポップンコンストラクタ)。 – miikkas

答えて

2

こちらのドキュメントを参照してくださいは、実施例である:

mainProcess = subprocess.Popen(['python', pyfile, param1, param2], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

# get the return value from the method 
communicateRes = mainProcess.communicate() 

stdOutValue, stdErrValue = communicateRes 

あなたはあなたができるcommunicate()を使用することによりpython.exe pyfile param1 param2

を呼んでいますstdoutstderrTuple

としてください10

あなたは、例えば、リストにあなたの文字列を分割するためのpythonメソッドsplit()を使用することができます。

cmd = "python.exe myfile.py arg1 arg2" 

cmd.split(" ") 

出力:

['python.exe', 'myfile.py', 'arg1', 'arg2'] 
+2

'cmd.split( '')'は引用符を扱うことができないので避けてください。 'shlex.split'を代わりに使用してください。これはシェルのコマンドに使用される構文を知っており、''program ''のようなものを単一の引数として引用符 "''を期待通りに扱うことができます。 – Bakuriu

+0

ニースはそれを知らなかった –

1

check_call関数はコマンドが完了するのを待つべきだと思います。

@mikkasはちょうどここlistとしてそれを使用することをお勧めしたようhttp://docs.python.org/2/library/subprocess.html

+0

私は実行中のプロセスの標準出力を読む必要があります。 subprocess.check_callはstdoutを読み取ることができますか?もしそうなら、これを達成する方法を明確にしてください。 – alphanumeric

+1

代わりにsubprocess.check_outputを使用してみてください。 – Aaron

-1

チェックコールは待機しません。そのようなプロセスが必要です。wait()を呼び出し、リターンコードを明示的にチェックして必要な機能を取得します。

Process = subprocess.Popen('%s' %command_string,stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
      Process.wait() 
      if Process1.returncode!=0: 
        print Process1.returncode 
        sendMail() 
        return 
      else: 
        sendMail() 
関連する問題