在Python中无缓冲打印os.popen()的输出

3 投票
1 回答
4902 浏览
提问于 2025-04-15 19:31

假设我有一个程序,它会打印出一些数据,类似于下面的这段 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()

撰写回答