python中subprocess执行shell命令,怎样做到及时的获取shell命令输出内容

seai 2013-09-18 06:20:48
我想shell一有输出就能立即获得内容,如果使用subprocess.wait()的话,只能等所有代码都结束以后才能得到输出,且这样的话可能还存在管道被塞满的问题吧?
而下面的代码存在一个问题是,循环永远不会退出,returncode值永远得不到。
求大牛给一个可行的解决方案。

import subprocess
subp=subprocess.Popen('python /tmp/test.py',shell=True,stdout=subprocess.PIPE)
while subp.returncode=None:
print subp.returncode,subp.stdout.readline()
print subp.returncode


#/tmp/test.py
for i in range(1,10):
print i
...全文
5638 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
碼上道 2013-09-19
  • 打赏
  • 举报
回复
刚好也有类似的需求,借用一下,3Q~~~
seai 2013-09-18
  • 打赏
  • 举报
回复
相比:
import subprocess
subp=subprocess.Popen('python -u /tmp/test.py',shell=True,stdout=subprocess.PIPE)
c=subp.stdout.readline()
while c:
    print c
    c=subp.stdout.readline()
subp.wait()
print subp.returncode
下面的实现更严谨一些吧:
import subprocess
subp=subprocess.Popen('python -u /tmp/test.py',shell=True,stdout=subprocess.PIPE)
while subp.poll()==None:
    print stdout.readline()
print subp.returncode
seai 2013-09-18
  • 打赏
  • 举报
回复
引用 4 楼 angel_su 的回复:
可以按你原来的稍改一下while条件: while subp.poll() == None:
多谢楼上,让我把wait、poll的区别也搞清了。
angel_su 2013-09-18
  • 打赏
  • 举报
回复
可以按你原来的稍改一下while条件: while subp.poll() == None:
yueguanghaidao 2013-09-18
  • 打赏
  • 举报
回复
Popen.poll() 用于检查子进程是否已经结束。设置并返回returncode属性。 Popen.wait() 等待子进程结束。设置并返回returncode属性。 不然,不会设置returncode
seai 2013-09-18
  • 打赏
  • 举报
回复
引用 1 楼 yueguanghaidao 的回复:
其实,并不是你想的那样,因为test.py,也不是实时输出,只有在每次输出,清空一下stdout才能看到你想看到的效果。 test.py
import sys
import time
for i in range(1,10):
    print i
    sys.stdout.flush()
    time.sleep(1)
import subprocess
subp=subprocess.Popen('python test.py',shell=True,stdout=subprocess.PIPE)
c=subp.stdout.readline()
while c:
    print c
    c=subp.stdout.readline()

print subp.returncode
这样,你观察很明显,如果你将sys.stdout.flush(),删除,你会发现都是最后一刻才输出,因为print时代缓冲的。
确实不错,不过试过之后,发现subp.returncode之前必须subp.wait()。
yueguanghaidao 2013-09-18
  • 打赏
  • 举报
回复
其实,并不是你想的那样,因为test.py,也不是实时输出,只有在每次输出,清空一下stdout才能看到你想看到的效果。 test.py
import sys
import time
for i in range(1,10):
    print i
    sys.stdout.flush()
    time.sleep(1)
import subprocess
subp=subprocess.Popen('python test.py',shell=True,stdout=subprocess.PIPE)
c=subp.stdout.readline()
while c:
    print c
    c=subp.stdout.readline()

print subp.returncode
这样,你观察很明显,如果你将sys.stdout.flush(),删除,你会发现都是最后一刻才输出,因为print时代缓冲的。

37,738

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧