Communicating with a program using subprocess

Nobody nobody at nowhere.com
Fri Jun 18 20:45:23 EDT 2010


On Thu, 17 Jun 2010 11:22:37 +0200, Laurent Verweijen wrote:

>         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.




More information about the Python-list mailing list