python中的后台进程与终端上的-e选项

时间:2012-06-16 16:16:51

标签: python unix subprocess background-process

我想编写一个基于控制台的包装器来启动程序,除非我尝试使用'urxvt -e myscript'或某些变体运行它,否则它可以正常工作。例如:

test.py

#!/usr/bin/python2.7
import subprocess

print 'Press enter to launch'
raw_input()

subprocess.Popen( ['firefox'] )

如果我在带有./test.py的终端中运行它,它会按预期工作。 Firefox启动,脚本存在。但是,如果我使用'urxvt -e ./test.py'尝试此操作,脚本将打开,运行并启动Firefox。但是当脚本退出时,firefox就会被杀死。

如果我使用'term -e script'运行脚本,如何在脚本退出时不启动程序。

编辑:更清楚: 我想启动一个运行python脚本的新终端。脚本完成它并启动程序。然后脚本退出,终端关闭,程序仍然运行。

3 个答案:

答案 0 :(得分:1)

将&符号(&)添加到您启动的命令中。

subprocess.Popen( ['firefox &'] )

答案 1 :(得分:1)

测试时,我发现结果高度依赖于要启动的程序,问题与python无关。我从来没有注意到它,但是“term -e program”仅适用于某些程序,其他程序则以我所获得的行为退出。有些程序不保留继承的pid / sid,而其他程序则保留。

例如

>>> print os.getpid()
3556
>>> os.execl( '/usr/bin/gvim', 'gvim' )

快速'ps -e'显示

3556 pts/1    00:00:00 gvim <defunct>
3557 ?        00:00:00 gvim

当启动终端关闭时,所有具有相同sid的进程关闭。所以'gvim defunct'消失但另一个仍然存在。当启动终端关闭时,未获得新pid / sid的程序将退出。解决方案是强制在流程上强制使用新的sid。

import os

if os.fork():
    # parent
    do_stuff()

else:
    # child
    os.setsid()
    os.execl('prog', 'prog')

答案 2 :(得分:0)

import os

print 'Press enter to launch'
raw_input()

if os.fork():
    # Parent
    print 'clean up'
    raw_input()

else:
    # Child
    os.execl('/usr/bin/firefox', 'firefox')

os.execl用firefox进程替换了python进程。

正如您所说,使用subprocess.Popen,当脚本结束时,firefox子进程将被终止。

使用os.execl,脚本本身并未结束。它被替换为firefox进程,它不会立即结束(并且不会被终止)。达到os.execl命令后,它会像您调用term -e firefox一样有效。