tags:

views:

321

answers:

1

Let's say that I have a process that prints out some data something like this ruby code.

1.upto(10) { 
  |i| 
  puts i 
  puts "\n" 
  sleep 0.6 
} 

I want to have a python code that spawns this process, and read data from it to print it out.

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() 

The problem of this code is that it doesn't print the number one by one. It seems like that python prints out all the buffered data at the last point.

Is there a way to print out the output of spawned process without buffering?

+4  A: 

The data is being buffered by ruby. Use something like

$stdout.flush

to make it flush. I'm not sure if that's the correct ruby command to do that.


Obligatory:

Use subprocess module. os.popen has been replaced by it.

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()
nosklo
@nosklo : The ruby code with $stdout.flush works fine. But I get error when run the python code. Something wrong with this?<PRE>/Users/smcho/Desktop/test/testit.rb:5:in `flush': Broken pipe (Errno::EPIPE) from /Users/smcho/Desktop/test/testit.rb:5 from /Users/smcho/Desktop/test/testit.rb:1:in `upto' from /Users/smcho/Desktop/test/testit.rb:1</PRE>
prosseek
os.popen() just works.
prosseek
It was a typo. I fixed it.
nosklo