作者Holocaust123 (一步一脚印)
看板Python
标题Re: [问题] 如何在父程序结束後不终止子程序
时间Thu Jul 14 23:42:39 2011
※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
: ※ 引述《Holocaust123 (一步一脚印)》之铭言:
: : #!/usr/bin/python
: : #coding=utf8
: : import subprocess
: : cmd = 'test.sh'
: : p = subprocess.Popen(cmd)
: : print 'end of program'
: : 假设上面是a.py的内容
: : 有几个问题想问:
: : 1. 如何让a.py执行时, 不要等待test.sh的执行结果, 而是直接执行print statement
: : 我仔细看过 http://docs.python.org/library/subprocess.html 了
: : 但这个module似乎没有类似os module的"no wait"功能
: 咦?
: Popen 本来就不会 wait 吧
: 要强制停下来等它执行完再继续, 必须加上(以你的例子) p.wait() 等 p 结束
: 除非你把 stdout 或/和 stderr 给 PIPE 到父程序, 那会自动变成 blocking
: 不过这是非常合理的设定...
: : 2. 如何让a.py执行结束後, 不要terminate subprocess(即让test.sh在a.py结束後依然继续执行)
: : 目前我找到的方法只能在Linux上使用(用nohup指令)
: : 但我想找跨平台的作法, 也就是在Windows或Linux上皆适用的方法
: subprocess 创造出来的子程序确实不会在父程序结束後同时停止, 会执行到完啊...
: 我在 Mac (OS X 10.6) 和 Linux (Mint 10) 上分别用 2.6.x 确认过了, 都一样
: 不确定 Windows 的状况, 不过应该不会有差才对?
: : 这两个问题困扰我很久了, 希望好心人能指点一下
: : 如果可以的话希望不要提供deprecated modules的作法, 谢谢
第一眼看完u大的回文跟上面几篇文时 我还以为我看错了 怎麽情况跟我完全不一样
我的情况是只要父程序一终止 子程序也会跟着终止 屡试不爽
怎麽会这样呢?
後来终於找到问题点...
环境
OS: Xubuntu 11.04
Python: 2.7.1
编辑器: Vim 7.3
我的Vim设定档中有这一段
if has('unix') && (!has('gui_running'))
au FileType python map <silent> <buffer> <F10> <ESC>:w<CR>:!screen bash -c "python \"%\" ; read -p \"press ENTER to continue...\""<CR>
这段的作用是 只要Vim编辑的档案的类型是python文字档(即.py, 假设档名叫a.py) 按下F10就会执行这行指令:
screen bash -c "python a.py ; read -p \"press ENTER to continue...\""
这行指令的用途是:
避免Vim编辑a.py的视窗在以外部指令执行python a.py时冻结住
换句话说就算a.py正在执行 依然可以用Vim编辑a.py
(这边我讲的很粗略 详情可看
#1DANDkhR (Editor))
screen指的是gnu screen(
http://www.gnu.org/s/screen/ )
意思就是在terminal开启一个新的screen window来执行python程式a.py
在a.py执行完闭後 在该window显示"press ENTER to continue..."
显示这个prompt("press...")的目的是, 让user(我)有机会看到a.py输出到萤幕的内容, 而非直接关闭该window
假设a.py的内容如下:
#!/usr/bin/python
#coding=utf8
import subprocess
raw_input('press enter to launch frd...\n')
cmd = 'frd.sh'
p = subprocess.Popen(cmd, shell=True)
raw_input('end')
用Vim打开a.py, 按F10执行之
会产生一个新screen window在terminal, 萤幕显示"press enter to launch frd..."
按下enter, frd.sh就会被执行, frd GUI程式跳出来了(frd是一个GUI程式, frd.sh是用来开启他的)
然後马上会看到萤幕显示"end",
按下enter, 萤幕会显示"press ENTER to continue..."
按下enter, frd GUI就被关掉了 => 这就是为什麽我本来以为subprocess预设是"父死子就死"的原因
但其实subprocess如同u大所说 并非"父死子就死"的原因
真正导致frd GUI(子)终止的的原因是上面绿色那行...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.31.149
1F:→ hSATAC:感觉你的 vimrc 里面很多你不清楚的东西 (editor版的印象) 07/14 23:48
2F:→ hSATAC:要不要找一天好好把 vimrc 整一次啊 XD 07/14 23:49
我的vimrc我很清楚啊(每一行都仔细研究过的) 但缺乏整理是真的
※ 编辑: Holocaust123 来自: 140.112.31.149 (07/14 23:50)