2

Linuxでのコンストラクターにshell=True渡されて作成されたサブプロセスを強制終了すると、シェルのみが強制終了され、シェルによって作成されたプロセスは強制終了されません( shell = Trueで起動されたPythonサブプロセスを終了する方法を参照)。ただし、Windows Vistax64SP3およびPython2.7.364ビットで実行すると、プロセスが強制終了されます。Windowsでは。ただし、この関数のドキュメントには次のように記載されていますsubprocess.Popenpython -c "import subprocess; subprocess.Popen(['ping', '-t', 'google.com'], shell=True).terminate()"pingsubprocess.Popen.terminate() TerminateProcess

指定されたプロセスとそのすべてのスレッドを終了します。

プロセスツリー全体を終了することについては言及されていません。私は何が欠けていますか?

4

1 に答える 1

2

これはあなたが与えたワンライナーだけだと思います、そして私の観察はそれpingが始まってさえいないことを示唆しています。スクリプトとして実行する場合(Windows 7):

import subprocess

proc = subprocess.Popen(['ping', '-t', 'google.com'], shell=True)

raw_input("<RETURN> to terminate")
proc.terminate()

raw_input("<RETURN> to end")

次に、proc.terminate()シェルを終了するだけで、 ! は終了しません。ping

ただし、設定shell=Falseすると、期待どおりに動作します-を終了しpingます。Python2.7および3.2でも同じ動作。

編集:私はこのコードをワンライナーとしても試しましたが、質問者と同じ結果が得られました。sleep私はハックが嫌いですが、これは機能します:

python -c "import subprocess,time;proc = subprocess.Popen(['ping','-t', 'google.com'], shell=True);time.sleep(1);proc.terminate()"
于 2012-10-22T10:18:42.280 に答える