我试图从另一个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使用的代码示例.
所以不用shell直接运行:
proc = subprocess.Popen(['python', './script.py'])
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可能需要考虑将硬编码更改'python'为sys.executable. 另外,您可以使用proc.kill()杀死进程而不是提取 PID 并使用它;此外,即使您确实需要通过 PID 来终止,您也可以使用os.kill终止进程而不是生成另一个命令。
| 归档时间: |
|
| 查看次数: |
20589 次 |
| 最近记录: |