2009-10-21 31 views
6

私は(Popenを使って)サブプロセスを起動するpythonプログラムを書いています。 私はサブプロセスのstdoutを読み込み、いくつかのフィルタリングを行い、メインプロセスの stdoutに書き込みます。pythonプロセスが終了したときにサブプロセスを終了しますか?

メインプロセス(cntl-C)を終了すると、サブプロセスは実行を継続します。 どのようにしてサブプロセスも強制終了できますか?サブプロセスは長い時間を実行するのと同じです。

コンテキスト: 一度に1つのサブプロセスしか起動しません。標準出力をフィルタリングしています。 ユーザは、何かを試すために中断することを決定するかもしれません。

私はPythonには新しく、ウィンドウを使用していますので、優しくしてください。

答えて

5

Windowsには信号がないため、信号モジュールは使用できません。ただし、Ctrl-Cを押すと、KeyboardInterrupt例外を捕捉できます。このような

何かがあなたが軌道に乗る必要があります。

import subprocess 

try: 
    child = subprocess.Popen(blah) 
    child.wait() 

except KeyboardInterrupt: 
    child.terminate() 
+2

Popen.wait()上のPythonドキュメントからの警告: 子プロセスがブロックを待っているように、標準出力や標準エラー出力パイプに十分な出力を生成した場合にデッドロックされます。この警告例えば

OSパイプバッファがより多くのデータを受け入れるためです。それを避けるには、()を使用してください。 –

+1

実際に 'signal.signal(signal.SIGINT、handlerFunc)'はPython 2.6.5でうまく動作します(r265:79096、2010年3月19日、21:48:26)[MSC v.1500 32ビット(Intel)] on win32 ;私はちょうどそれを試みた。 – RobM

0

subprocess.Popenオブジェクトは、killして来て、終了方法(異なるのは、ここであなたがプロセスに送るシグナル)。

signal.signalシグナルハンドラをインストールして、子プロセスのkillメソッドを呼び出すことができます。

0

python atexitモジュールを使用できます。

import atexit 

def killSubprocess(): 
    mySubprocess.kill() 

atexit.register(killSubprocess) 
関連する問題