如何在Windows上分离Python子进程(无setid)?

时间:2018-09-21 19:26:36

标签: python windows python-2.7 winapi

我正在将一些过程代码迁移到在Posix上运行良好的Windows。简而言之:因为setsid()不可用,所以启动子进程并立即分离的代码将不起作用:

import os, subprocess, sys
p = subprocess.Popen([sys.executable, '-c', "print 'hello'"], preexec_fn=os.setsid)

我可以删除对setsid的使用,但是子进程在父进程结束时结束。

我的问题是如何在Windows上达到与setsid相同的效果,以便子进程的生命周期独立于父进程的生命周期?

我愿意使用一种特定的Python软件包(如果有)用于这种事情。例如,我已经在使用psutil,但没有发现任何可以帮助我的东西。

1 个答案:

答案 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)