簡體   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