3 回答

TA貢獻1816條經驗 獲得超4個贊
您可以為子流程提供start_new_session模擬C:
#!/usr/bin/env python
import os
import sys
import platform
from subprocess import Popen, PIPE
# set system/version dependent "start_new_session" analogs
kwargs = {}
if platform.system() == 'Windows':
# from msdn [1]
CREATE_NEW_PROCESS_GROUP = 0x00000200 # note: could get it from subprocess
DETACHED_PROCESS = 0x00000008 # 0x8 | 0x200 == 0x208
kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP)
elif sys.version_info < (3, 2): # assume posix
kwargs.update(preexec_fn=os.setsid)
else: # Python 3.2+ and Unix
kwargs.update(start_new_session=True)
p = Popen(["C"], stdin=PIPE, stdout=PIPE, stderr=PIPE, **kwargs)
assert not p.poll()

TA貢獻1852條經驗 獲得超1個贊
以下是根據塞巴斯蒂安的答案和此答案改編而成的代碼段:
#!/usr/bin/env python
import os
import sys
import platform
from subprocess import Popen, PIPE
# set system/version dependent "start_new_session" analogs
kwargs = {}
if platform.system() == 'Windows':
# from msdn [1]
CREATE_NEW_PROCESS_GROUP = 0x00000200 # note: could get it from subprocess
DETACHED_PROCESS = 0x00000008 # 0x8 | 0x200 == 0x208
kwargs.update(creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, close_fds=True)
elif sys.version_info < (3, 2): # assume posix
kwargs.update(preexec_fn=os.setsid)
else: # Python 3.2+ and Unix
kwargs.update(start_new_session=True)
p = Popen(["C"], stdin=PIPE, stdout=PIPE, stderr=PIPE, **kwargs)
assert not p.poll()
我只是在Windows上親自測試過。

TA貢獻1817條經驗 獲得超14個贊
代碼的意圖是,std*=DEVNULL
即,您不能在此處省略stdin / stdout / stderr(至少在POSIX上- close_fds=True
不會在此處關閉std *)。close_fds=True
除非您打開了其他(非標準)文件描述符(關閉它們或通過close_fds=True
-POSIX上的Python 3的默認值),否則您不需要。在Windows上close_fds=True
就足夠了(無需重定向),這樣子進程就不會繼承父進程的文件描述符(在這種情況下,如果您寫入stdout或在Windows上一起傳遞std*=DEVNULL
, 我還沒有測試過會發(fā)生什么close_fds=True
)。
添加回答
舉報