2015-06-25 283 views
4

我想從另一個Python腳本運行一個Python腳本,並獲得它的pid,以便稍後可以殺死它。python - subprocess.Popen()。pid返回父腳本的pid

我試圖subprocess.Popen()與參數shell=True', but the pid attribute returns the pid`父母的腳本,所以當我試圖殺死子進程,它殺死了父母。

這裏是我的代碼:

proc = subprocess.Popen(" python ./script.py", shell=True) 
pid_ = proc.pid 
. 
. 
. 
# later in my code 

os.system('kill -9 %s'%pid_) 

#IT KILLS THE PARENT :(

回答

1

所以直接無殼運行:

proc = subprocess.Popen(['python', './script.py']) 

順便說一句,你可能要考慮更改硬編碼'python'sys.executable。此外,您可以使用proc.kill()來終止進程而不是提取PID並使用它;此外,即使您確實需要通過PID殺死,您也可以使用os.kill來終止進程而不是產生另一個命令。

+0

它仍然殺死父母.. – farhawa

+0

@farhawa:你可以更新你的問題,澄清發生了什麼?我理解你說,有一個Python解釋器產生一個產生另一個Python解釋器的shell,並且kill殺死了shell而不是所需的從屬解釋器。 – icktoofay

6

shell=True啓動一個新的shell進程。 proc.pid是該shell進程的pid。 kill -9殺死了將孫子python進程變成孤兒的shell進程。

如果孫子python腳本可以生成自己的子進程,並要殺掉整個進程樹再看看How to terminate a python subprocess launched with shell=True

#!/usr/bin/env python 
import os 
import signal 
import subprocess 

proc = subprocess.Popen("python script.py", shell=True, preexec_fn=os.setsid) 
# ... 
os.killpg(proc.pid, signal.SIGTERM) 

如果script.py不產卵的任何進程,然後使用@icktoofay suggestion:滴shell=True,使用名單的說法,並呼籲proc.terminate()proc.kill() - 後者總是工作最終:

#!/usr/bin/env python 
import subprocess 

proc = subprocess.Popen(["python", "script.py"]) 
# ... 
proc.terminate() 

如果你想運行你的父母得離譜從不同的目錄中獲得pt;你可能需要get_script_dir() function

考慮導入python模塊並運行其功能,使用其對象(可能通過multiprocessing)而不是將其作爲腳本運行。這裏是code example that demonstrates get_script_dir() and multiprocessing usage