2010-02-20 231 views
3

假设我有一个打印出一些类似于这个ruby代码的数据的进程。在Python中没有缓冲的情况下打印出os.popen()的输出

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在最后一点打印出所有缓冲数据。

有没有办法打印输出的产卵过程没有缓冲?

+0

相关:Python的子readlines方法()挂起(http://stackoverflow.com/q/12419198/4279) – jfs 2015-06-12 19:16:43

回答

5

数据正在被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() 
+0

@nosklo:以$ Ruby代码stdout.flush工作正常。但是运行python代码时出现错误。这有什么问题吗?

 /Users/smcho/Desktop/test/testit.rb:5:in 'flush': Broken pipe (Errno::EPIPE) \t from /Users/smcho/Desktop/test/testit.rb:5 \t from /Users/smcho/Desktop/test/testit.rb:1:in 'upto' \t from /Users/smcho/Desktop/test/testit.rb:1 
prosseek 2010-02-21 02:50:03

+0

os.popen()正常。 – prosseek 2010-02-21 04:22:30

+0

这是一个错字。我修好了它。 – nosklo 2010-02-21 12:34:15

相关问题