我正在将一些过程代码迁移到在Posix上运行良好的Windows。简而言之:因为setsid()
不可用,所以启动子进程并立即分离的代码将不起作用:
import os, subprocess, sys
p = subprocess.Popen([sys.executable, '-c', "print 'hello'"], preexec_fn=os.setsid)
我可以删除对setsid
的使用,但是子进程在父进程结束时结束。
我的问题是如何在Windows上达到与setsid
相同的效果,以便子进程的生命周期独立于父进程的生命周期?
我愿意使用一种特定的Python软件包(如果有)用于这种事情。例如,我已经在使用psutil
,但没有发现任何可以帮助我的东西。
答案 0 :(得分:0)
RbMn对我的问题的评论实际上就是答案。不需要分离,因为Windows中的进程始终是顶级对象。我通过卧铺任务尝试了一下,效果很好。
正如eryksun在此处的注释中指出的, 然而,关闭控制台窗口将导致子进程终止。我在Windows上也遇到了Waitress和Popen的一些稳定性问题,我认为通过添加以下代码来设置某些process creation flags并使用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)