我想编写一个基于控制台的包装器来启动程序,除非我尝试使用'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脚本的新终端。脚本完成它并启动程序。然后脚本退出,终端关闭,程序仍然运行。
答案 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
一样有效。