Распечатайте выходные данные ОС.popen() без буферизации в python


Предположим, что у меня есть процесс, который выводит некоторые данные, что-то вроде этого кода 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 3

1 ответ:

Данные буферизуются 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()