免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7517 | 回复: 7
打印 上一主题 下一主题

[求助]Python管道即时读取输出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-29 17:07 |显示全部楼层 |倒序浏览
本帖最后由 wn0112 于 2013-05-29 17:07 编辑
  1. import subprocess, time   
  2. pipe = subprocess.Popen('myapp.exe file.ext', stdout=subprocess.PIPE)
  3. while 1:     
  4.     pipe.stdout.readline()     
  5.     time.sleep(0.2)
复制代码
在myapp.exe执行过程中会产生许多Log,我是想能够即时地把Log取出来显示在界面上。
但是发现read(), readlines(), communicate()都是会等待myapp.exe执行完毕,再读取所有输出,达不到“即时”的效果。
现在是用了一个等待循环,每0.2秒用readline()来读取一行显示在界面。
请问有没有更好的方法?更智能点的

论坛徽章:
0
2 [报告]
发表于 2013-05-30 10:43 |显示全部楼层
jeppeter 发表于 2013-05-30 06:26
回复 1# wn0112

不是的,myapp.exe 是可以即时输出Log信息到终端或管道的

论坛徽章:
0
3 [报告]
发表于 2013-05-30 11:03 |显示全部楼层
本帖最后由 wn0112 于 2013-05-30 11:09 编辑
jeppeter 发表于 2013-05-30 10:49
回复 3# wn0112

如果只是 “即时” 输出到终端的话(也就是sys.stdout)这样就可以了,是没问题的

  1. import subprocess
  2. pipe = subprocess.Popen('myapp.exe file.ext')

复制代码
但现在是要取得输出内容,就用了管道,除非用readline(),read(), communicate()都不能“即时”

你是说这样用吗?也是不行的,要等myapp.exe结束才有输出

  1. import subprocess, time   
  2. pipe = subprocess.Popen('myapp.exe file.ext', stdout=subprocess.PIPE)
  3. while 1:
  4.     pipe.stdout.flush()   
  5.     pipe.stdout.read()     
  6.     time.sleep(0.2)
复制代码
如果在read()里设置字节数,且字节数小于实际内容,也可以即时,但如果大于实际内容也不会即时了,好像要等达到字节数或结束才输出

  1. import subprocess, time   
  2. pipe = subprocess.Popen('myapp.exe file.ext', stdout=subprocess.PIPE)
  3. while 1:  
  4.     pipe.stdout.read(5)     
  5.     time.sleep(0.2)
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-05-30 12:16 |显示全部楼层
jeppeter 发表于 2013-05-30 11:23
回复 5# wn0112

myapp.exe是第三方程序,不是我写的,它没有flush, 你是这个意思??
应该不关myapp.exe的事,我用tcl脚本实现同样的事情,就可以得到即时输出, 用的是read方式,不是readline

论坛徽章:
0
5 [报告]
发表于 2013-05-30 14:11 |显示全部楼层
jeppeter 发表于 2013-05-30 12:49
回复 7# wn0112

说的就是read()不能即时啊……只有readline()加个延时循环才能达到目的,现在是想寻求更好的方法……

论坛徽章:
0
6 [报告]
发表于 2013-05-30 14:19 |显示全部楼层
laike9m 发表于 2013-05-30 12:56
试试把读取管道内容的代码放在另一个线程里面呢?我以前在某个需要输出即时进度的地方这样做过。

怎么放呢?

我的问题是:
  • 现在我用readline()加一个延迟循环读取是可以实现的即时,正如我一楼的例子。但我觉得这个例子不是很好,有没有更好的方式?
  • 用read()读Log达不到即时的效果,read()会等待myapp.exe结束才读取全部Log。是我使用错误,还是它就是这样的?

论坛徽章:
0
7 [报告]
发表于 2013-05-30 14:20 |显示全部楼层
106033177 发表于 2013-05-30 13:06
回复 1# wn0112
subprocess.Popen('myapp.exe file.ext',bufsize=0, stdout=subprocess.PIPE) 

bufsize=0试过了
使用pipe.stdout.read() 还是会等待myapp.exe结束才读取全部

论坛徽章:
0
8 [报告]
发表于 2013-06-14 18:23 |显示全部楼层
这个可以
  1. import subprocess
  2. pipe = subprocess.Popen('myapp.exe file.ext', stdout=subprocess.PIPE)
  3. for line in iter(pipe.stdout.readline, ''):     
  4.     print line
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP