[英]How to detach Python child process on Windows (without setsid)?
我正在将一些过程代码迁移到在Posix上运行良好的Windows。 简而言之:因为setsid()
不可用,所以启动子进程并立即分离的代码将不起作用:
import os, subprocess, sys
p = subprocess.Popen([sys.executable, '-c', "print 'hello'"], preexec_fn=os.setsid)
我可以删除setsid
的用法,但是当父进程结束时,子进程结束。
我的问题是如何在Windows上实现与setsid
相同的效果,以使子进程的生命周期独立于父进程的生命周期?
我愿意使用一种特定的Python软件包(如果有)用于这种事情。 例如,我已经在使用psutil
,但没有看到任何可以帮助我的东西。
RbMn对我的问题的评论实际上就是答案。 不需要分离,因为Windows中的进程始终是顶级对象。 我通过卧铺任务尝试了一下,效果很好。
但是,正如eryksun在此处的注释中指出的那样,关闭控制台窗口将导致子进程终止。 我在Windows上的Waitress和Popen中也遇到了一些稳定性问题,我认为我已经通过添加以下代码来解决这些问题,这些代码设置了一些进程创建标志并使用close_fds
:
if 'nt' == os.name:
flags = 0
flags |= 0x00000008 # DETACHED_PROCESS
flags |= 0x00000200 # CREATE_NEW_PROCESS_GROUP
flags |= 0x08000000 # CREATE_NO_WINDOW
pkwargs = {
'close_fds': True, # close stdin/stdout/stderr on child
'creationflags': flags,
}
p = subprocess.Popen([sys.executable, '-c', cmd], **pkwargs)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.