繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM