gpt4 book ai didi

python 无法在 teed 时分离进程。如何跨越后台进程并无需等待退出?

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:56 25 4
gpt4 key购买 nike

我从一个简单的测试用例开始:

cat foo2.py
#!/usr/bin/python
import subprocess, sys, os

def alert():
subprocess.Popen ("xterm &", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)

if __name__ == "__main__":

print "hello"
alert ()
os._exit (0)

当我定期在命令行上运行该代码时,它有效:

./foo2.py

返回 unix 提示符,xterm 在后台运行。

但是,当我用 t 恤运行该代码时

./foo2.py | tee my.log

在关闭 xterm 之前,我没有得到 unix 提示。

如何让 python 脚本退出,但让 xterm 在后台运行?

我看过:Python spawn off a child subprocess, detach, and exit以及那里提到的 activestate 配方。我已经使用该代码创建了一个简单的测试用例,它只是在后台打开一个 xterm:

cat foo.py
#!/usr/bin/python
import subprocess, sys, os

def alert():
subprocess.Popen ("xterm &", shell=True, stdin=None, stdout=None, stderr=None)

def createDaemon():
"""Detach a process from the controlling terminal and run it in the
background as a daemon.
"""
try:
pid = os.fork() # Fork a first child.
except OSError, e:
raise Exception, "%s [%d]" % (e.strerror, e.errno)

if (pid == 0): # The first child.
os.setsid()
try:
pid = os.fork() # Fork a second child.
except OSError, e:
raise Exception, "%s [%d]" % (e.strerror, e.errno)

if (pid == 0): # The second child.
alert ()
else:
os._exit(0) # Exit parent (the first child) of the second child.
else:
os._exit(0) # Exit parent of the first child.

# Close all open file descriptors. This prevents the child from keeping
import resource # Resource usage information.
maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
if (maxfd == resource.RLIM_INFINITY):
maxfd = 1024

# Iterate through and close all file descriptors.
for fd in range(0, maxfd):
try:
os.close(fd)
except OSError: # ERROR, fd wasn't open to begin with (ignored)
pass

os.open(REDIRECT_TO, os.O_RDWR) # standard input (0)
os.dup2(0, 1) # standard output (1)
os.dup2(0, 2) # standard error (2)

return(0)

if __name__ == "__main__":

print "hello"
retCode = createDaemon()

sys.exit (0)

当我定期在命令行上运行该代码时,它有效:

./foo.py

返回 unix 提示符,xterm 在后台运行。

但是,当我用 t 恤运行该代码时

./foo.py | tee my.log

在关闭 xterm 之前,我没有得到 unix 提示。

如何让 python 脚本退出,但让 xterm 在后台运行?

最佳答案

运行nohup xterm &(这样进程就解耦了)

关于python 无法在 teed 时分离进程。如何跨越后台进程并无需等待退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com