2012-03-07 11 views
4

私は科学的なソフトウェア(vaspと呼ばれています)を使用しています。これはbashでのみ動作し、Pythonを使用して複数回実行されるスクリプトを作成します。関数を普通に呼び出すためにsubprocess.check_callを使うとうまくいきますが、 '| tee_output 'は動作しません。| bash関数を使用して複数のbash関数を呼び出す方法

subprocess.check_call('vasp') #this works 
subprocess.check_call('vasp | tee tee_output') #this doesn't 

私はPythonとプログラミングの両方にnoobieです。

答えて

4

これを試してください。コマンドを直接実行するのではなく、シェルを介してコマンドを実行します(文字列として渡します)。 (それはすなわちPopen(['/bin/sh', '-c', args[0], args[1], ...])-cフラグでシェル自体を呼び出すのと同等です):

subprocess.check_call('vasp | tee tee_output', shell=True) 

しかし、この方法についてdocsに警告に出席します。

+0

に複数の文字列を追加します。ありがとう:)シェルは本当ですか? – mrkent

+0

@ user1255726:[シェルを使ってコマンドを実行する](http://docs.python.org/library/subprocess.html#frequently-used-arguments)。 –

+0

@ user1255726、私はあなたの言葉であなたのソフトウェアは「bashでしか動かない」と思います。それが実際には当てはまらない場合は、セキュリティ上の理由から、他の回答のほうが望ましいでしょう。その場合は教えてください。 – senderle

2

あなたはこれを行うことができます:

vasp = subprocess.Popen('vasp', stdout=subprocess.PIPE) 
subprocess.check_call(('tee', 'tee_output'), stdin=vasp.stdout) 

これは、あなたが入力を信頼することはできません場合は特に、shell=Trueを使用するよりも、一般的に安全です。 check_callは、むしろvaspより、teeのリターンコードをチェックすることがCalledProcessErrorを上げる必要があるかどうかを確認するために

注意。 (shell=Trueメソッドはシェルパイプの振る舞いに一致するので、同じ方法を使用します)。必要ならばの戻りコードを自分で確認することができます。vasp.poll()を呼び出します。 (他の方法は、あなたがこれを行うことはできません。)

2

真=シェルを使用しないでください、それは多くのセキュリティホールを持っています。この

cmd1 = ['vasp'] 
cmd2 = ['tee', 'tee_output'] 

runcmd = subprocess.Popen(cmd1, stdout=subprocess.PIPE) 
runcmd2 = subprocess.Popen(cmd2, stdin=runcmd.stdout, stdout=subprocess.PIPE) 

runcmd2.communicate() 

ような何かを行う代わりに、私はその長いを知っているが、そのはるかに安全。

関連する問題