gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:13:00 28 4
gpt4 key购买 nike

我正在尝试从另一个 Python 脚本运行一个 Python 脚本,并获取它的 pid 以便稍后可以终止它。

我尝试使用参数 shell=True' 的 subprocess.Popen(),但是pid属性返回父脚本的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 :(

最佳答案

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

如果孙子 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()

如果你想从不同的目录运行你的父脚本;你可能需要 get_script_dir() function .

考虑导入 python 模块并运行其功能,使用其对象(可能通过 multiprocessing)而不是将其作为脚本运行。这是 code example that demonstrates get_script_dir() and multiprocessing usage .

关于python - subprocess.Popen().pid 返回父脚本的 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31039972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com