我想编写一个基于控制台的包装器来启动一个程序,除非我尝试使用“urxvt-emyscript”或其他变体来运行它,否则它可以正常工作。例如:
在测试.py在
#!/usr/bin/python2.7
import subprocess
print 'Press enter to launch'
raw_input()
subprocess.Popen( ['firefox'] )
如果我在终端上运行这个/测试.py,它按预期工作。Firefox启动时,脚本存在。但如果我用“urxvt-e”试试这个/测试.py'脚本打开、运行,然后firefox启动。但是当脚本退出时,firefox就会被杀死。在
如果我使用“term-e script”运行脚本,如何启动一个程序,使其在脚本退出时不被终止。在
编辑:为了更清楚: 我想启动一个运行python脚本的新终端。脚本完成它的工作并启动程序。然后脚本退出,终端关闭,程序继续运行。在
并启动(&;符号)来添加。在
在测试时,我发现结果高度依赖于要启动的程序,而这个问题与python无关。我从来没有注意到,但“术语-e程序”只适用于某些程序,其他程序则会以我所得到的行为退出。有些程序不保留继承的pid/sid,而有些程序则保留继承的pid/sid。在
例如
一个快速的“ps-e”显示
^{pr2}$当启动终端关闭时,具有相同sid的所有进程都将关闭。所以“gvim失效”消失了,但另一个仍然存在。当启动终端关闭时,没有获得新的pid/sid的程序将退出。解决方案是在进程上强制使用一个新的sid。在
os.execl用firefox进程替换python进程。在
正如你所说子流程.Popen,当脚本结束时,firefox子进程被终止。在
使用
os.execl
,脚本本身不会结束。它被firefox进程取代,而firefox进程不会(立即)结束(也不会被终止)。一旦到达os.execl
命令,它的行为就像您调用了term -e firefox
一样有效。在相关问题 更多 >
编程相关推荐