ScotchAndSoda
ScotchAndSoda

Reputation: 4171

Popen stdout reading pipe, deadlock using sleep

Well, I have two scripts. The a.py which prints the output of the b.py script as follows:

#a.py
from subprocess import Popen, PIPE, STDOUT

p = Popen(['/Users/damian/Desktop/b.py'], shell=False, stdout=PIPE, stderr=STDOUT)

while p.poll() is None:
    print p.stdout.readline()


#b.py
#!/usr/bin/env python
import time

while 1:
    print 'some output'
    #time.sleep(1)

This works.But, Why do my scripts deadlock when I uncomment the time.sleep() line?

Upvotes: 3

Views: 1470

Answers (2)

jfs
jfs

Reputation: 414207

If you add -u to the call in a.py (make the output unbuffered) then you don't need to modify b.py script:

import sys
from subprocess import Popen, PIPE, STDOUT

p = Popen([sys.executable, '-u', '/Users/damian/Desktop/b.py'],
          stdout=PIPE, stderr=STDOUT, close_fds=True)
for line in iter(p.stdout.readline, ''):
    print line,
p.stdout.close()
if p.wait() != 0:
   raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode))

See more ways to get output from a subprocess.

Upvotes: 2

Martijn Pieters
Martijn Pieters

Reputation: 1121834

Your output is probably buffered. Add a .flush() for stdout to clear it:

import sys
import time

while 1:
    print 'someoutput'
    sys.stdout.flush()
    time.sleep(1)

Upvotes: 5

Related Questions