Вывести вывод os.popen () без буферизации в python - PullRequest
3 голосов
/ 21 февраля 2010

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

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