2010-02-20 234 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

相關問題