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