python - subprocess.Popen().pid返回父脚本的pid

far*_*awa 6 python subprocess

我试图从另一个Python脚本运行一个Python脚本,并获得它,pid以便我可以在以后杀死它.

我尝试subprocess.Popen()使用父脚本的参数shell=True', but thepid attribute returns thepid`,所以当我尝试杀死子进程时,它会杀死父进程.

这是我的代码:

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 :(
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 11

shell=True启动一个新的shell进程.proc.pid是shell进程的pid.kill -9杀死shell进程,使孙子python进程成为一个孤儿.

如果孙子python脚本可以生成自己的子进程,并且想要终止整个进程树,那么请参阅如何终止使用shell = True启动的python子进程:

#!/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)
Run Code Online (Sandbox Code Playgroud)

如果script.py没有产生任何进程,那么使用@icktoofay建议:drop shell=True,使用list参数,并调用proc.terminate()proc.kill()- 后者总是最终起作用:

#!/usr/bin/env python
import subprocess

proc = subprocess.Popen(["python", "script.py"]) 
# ...
proc.terminate()
Run Code Online (Sandbox Code Playgroud)

如果要从其他目录运行父脚本; 你可能需要get_script_dir()功能.

考虑使用其对象(可能是通过multiprocessing)导入python模块并运行其函数,而不是将其作为脚本运行.这是演示get_script_dir()multiprocessing使用代码示例.


ick*_*fay 4

所以不用shell直接运行:

proc = subprocess.Popen(['python', './script.py'])
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可能需要考虑将硬编码更改'python'sys.executable. 另外,您可以使用proc.kill()杀死进程而不是提取 PID 并使用它;此外,即使您确实需要通过 PID 来终止,您也可以使用os.kill终止进程而不是生成另一个命令。