2016-08-26 1 views
0

私がやっているのは、シェルで実行するpythonスクリプトからプログラムを実行することです。さてこれで最初の問題は、私は多くの場合、シェルからプログラムを終了したいです同じi/oを持つPythonスクリプトからbash実行ファイルを実行するにはどうすればよいですか?

def bash(cmd): 
    subprocess.Popen(cmd, shell=True, executable='/bin/bash') 
bash('./my/file') 

:私はそれを行うことができますので、私は他の質問を読みました。通常、ターミナルから "./my/file"を実行すると、Ctrl + Cキーで停止できます。しかし、サブプロセスを使用すると、バックグラウンドで何とか実行され、 "top"コマンドでkillすることができ、bashのpidで殺すことができます。しかし、プログラムは非常に速く私は文字通りちょうどこの方法で合理的な方法でそれを殺すことができない多くのプロセスを生成します。

また、私がしたいのは、Pythonスクリプトをさらに実行する前にプログラムの実行が完了するのを待つことです。私は設定しようとしました...

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash') 
process.wait() 

しかし、実際には、起動直後にプログラムが停止します。

私は単なるスクリプトを別々に実行することができましたが、元のpythonスクリプトの後に自分自身を実行してからプログラムが完了しなければならない3番目のスクリプトを作成せずにプログラムの結果を使用する方法はありません。 提案がありますか?

答えて

0

あなたの最初の質問については、preexec_fn引数を試してみてください。

import signal 
import ctypes 
libc = ctypes.CDLL("libc.so.6") 
def set_pdeathsig(sig = signal.SIGTERM): 
    def callable(): 
     return libc.prctl(1, sig) 
    return callable 
p = subprocess.Popen(args, preexec_fn = set_pdeathsig(signal.SIGTERM)) 

これは、自動的に右の親プロセスが終了した後に終了しますsubprocess.Popenによって生成されたすべての子プロセスを保証します。ですから、あなたが殺す必要があるのは、単にPythonのプロセスだけです。これは、入力データが子プロセスに渡すことができ、その結果を返すことができ、それを通して、あなたのpythonのプロセスとその子プロセス間のパイプを構築します

process=subprocess.Popen(cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = process.communicate() 

あなた2番目の質問については、communicate方法を試してみてくださいバック。 communicateメソッドを呼び出さないと、通常、プロセスはバックグラウンドで実行され、存在する場合はその結果は破棄されます。

communicateメソッドを呼び出すと、親プロセスがここでブロックされ、子プロセスが終了するのを待機します。 outおよびerrは、子プロセスの通常出力とエラー出力を表します。これを使用してbashスクリプトの出力を取得することができます。

+0

私はちょっと忙しいので、ちょっと忙しかったので、ちょっと調べてみましたが、プログラムから正しく出力されますが、プログラムが実行されないことがあるため、ややうまく動作します。 –

関連する問題