Communicating with a program using subprocess


L

Laurent Verweijen

I have a file called increment.py as follows:

#!/usr/bin/python
n = 0
while True:
n = int(raw_input(n)) + 1

This is easy to understand, but I want to pipe it's input/output
by another python program. (I will show what I am doing on the
console to test it)
>>> from subprocess import *
>>> p = Popen(["python", "increment.py"], stdin=PIPE, stdout=PIPE)
>>> p.communicate("5")
Traceback (most recent call last):
File "increment.py", line 4, in <module>
n = int(raw_input(n)) + 1
EOFError: EOF when reading a line
('06', None) Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/subprocess.py", line 701, in communicate
return self._communicate(input)
File "/usr/lib/python2.6/subprocess.py", line 1184, in _communicate
self.stdin.flush()
ValueError: I/O operation on closed file

The problem is that I want to use communicate multiple times
before closing the file.

How could I achieve this
 
Ad

Advertisements

N

Nobody

This is easy to understand, but I want to pipe it's input/output
by another python program. (I will show what I am doing on the
console to test it)
from subprocess import *
p = Popen(["python", "increment.py"], stdin=PIPE, stdout=PIPE)
p.communicate("5")
Traceback (most recent call last):
File "increment.py", line 4, in <module>
n = int(raw_input(n)) + 1
EOFError: EOF when reading a line
The problem is that I want to use communicate multiple times
before closing the file.

How could I achieve this

Don't use communicate(). Use p.stdin.write() to send input, use
p.stdin.close() then p.wait() when you're finished.

If you also want to read the child process' stdout, either:

1. ensure that the child *never* writes more than a buffer's worth of data
at a time (the exact value is implementation-dependent, but up to 4K
should be fine for any modern Unix; I don't know about Windows),

2. use a separate thread for reading stdout,

3. use non-blocking I/O (use the fcntl module for Unix, you need PyWin32
for Windows), or

4. have the process write to a file instead of a pipe.

See the implementation of subprocess.Popen.communicate for clues.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top