【问题标题】:Print out the output of os.popen() without buffering in python打印出 os.popen() 的输出而不在 python 中缓冲
【发布时间】:2011-01-19 05:32:55
【问题描述】:

假设我有一个进程可以打印出一些数据,比如这个 ruby​​ 代码。

1.upto(10) { 
  |i| 
  puts i 
  puts "\n" 
  sleep 0.6 
} 

我想要一个生成这个进程的 python 代码,并从中读取数据以打印出来。

import os 
import sys 
cmd = "ruby /Users/smcho/Desktop/testit.rb"; 
pingaling = os.popen(cmd,"r") 
while 1: 
    line = pingaling.readline() 
    if not line: break 
    print line, 
    sys.stdout.flush() 
pingaling.close() 

这段代码的问题是它没有一个一个地打印数字。似乎python在最后一点打印出所有缓冲数据。

有没有办法在不缓冲的情况下打印出衍生进程的输出?

【问题讨论】:

标签: python ruby popen flush


【解决方案1】:

数据正在被 ruby​​ 缓冲。使用类似的东西

$stdout.flush

让它齐平。我不确定这是否是正确的 ruby​​ 命令。


强制性:

使用subprocess 模块。 os.popenhas been replaced由它。

import subprocess
import sys

cmd = ["ruby", "/Users/smcho/Desktop/testit.rb"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
    print line, 
    sys.stdout.flush() 
p.wait()

【讨论】:

  • @nosklo :带有 $stdout.flush 的 ruby​​ 代码可以正常工作。但是运行python代码时出现错误。这有什么问题吗?
     /Users/smcho/Desktop/test/testit.rb:5:in flush': Broken pipe (Errno::EPIPE) 	from /Users/smcho/Desktop/test/testit.rb:5 	from /Users/smcho/Desktop/test/testit.rb:1:in upto' 来自 /Users/smcho/Desktop/test/testit.rb:1 
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2019-07-07
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多