在Python中无缓冲打印os.popen()的输出
假设我有一个程序,它会打印出一些数据,类似于下面的这段 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 是在最后一次性打印出所有缓存的数据。
有没有办法让启动的程序的输出不经过缓存,直接打印出来呢?
1 个回答
5
数据正在被 Ruby 缓存。你可以使用类似下面的代码
$stdout.flush
来让它刷新。我不确定这是不是正确的 Ruby 命令。
顺便提一下:
使用 subprocess
模块。os.popen
已经被它替代了。
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()