1

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

测试.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 脚本的新终端。脚本做它的事情并启动程序。然后脚本退出,终端关闭,程序继续运行。

4

3 回答 3

1

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

subprocess.Popen( ['firefox &'] )
于 2012-06-16T16:39:05.560 回答
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')
于 2012-06-17T00:55:22.170 回答
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将 python 进程替换为 firefox 进程。

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

使用os.execl,脚本本身不会结束。它被替换为不会(立即)结束(并且不会被杀死)的 firefox 进程。到达os.execl命令后,它的行为就像您调用了term -e firefox.

于 2012-06-16T16:37:10.697 回答