gpt4 book ai didi

Python 子进程脚本完成后继续运行

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:48 24 4
gpt4 key购买 nike

在我的一个 Django View 中,我正在调用一个 python 脚本并获取它的 pid:

from subprocess import Popen
p = Popen(['python', 'script.py'])
mypid = p.pid

当试图找出进程是否仍在从另一个页面运行时,我在 mypid 上使用了以下函数(感谢 this question):

def doesProcessExist(pid):
if pid < 0:
return False
try:
os.kill(pid, 0)
except OSError, e:
return e.errno == errno.EPERM
else:
return True

无论我等待多久,进程仍显示为正在运行。唯一阻止它的是,如果我用 Popen 生成一个新的 python 脚本进程。 我能解决这个问题吗?我不确定这是由于 Django 在脚本完成后没有正确关闭 python 还是其他原因造成的。在 Ubuntu 的进程状态管理器中,进程显示为 [python] <defunct> .

--

问题对所有script.py都是正确的我努力了。我目前正在使用一个简单的方法:

from time import sleep
sleep(5)

最佳答案

真的,你做的是错的。当您使用像 subprocess.Popen 这样的高级包装器时,您需要通过该对象来管理流程。仅在别处拥有 PID 不足以管理它。

如果您坚持处理 PID 而不是 Popen 对象,那么您应该使用 os 中的低级 API。

幸运的是,您没有做任何复杂的事情,比如创建管道来与子进程对话。所以,你可以用你最喜欢的 spawn 来启动它。变体,然后用 waitpid 等待它或其变体之一。


我假设您是在单进程网络服务器中完成这一切的。如果您使用的是 fork Web 服务器,那么其他页面可能处于不同的进程中,即使使用 PID 也行不通。父进程必须收获子进程,而不是其他任意进程。如果你想让它起作用,你就必须让事情变得更复杂,而且在任何人向你解释它之前,你真的必须了解 Unix 进程模型。

关于Python 子进程脚本完成后继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157197/

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