Bidrectional Subprocess Communication
gagsl-py2 at yahoo.com.ar
Sun Dec 14 22:46:50 CET 2008
En Sun, 14 Dec 2008 09:37:38 -0200, Emanuele D'Arrigo <manu3d at gmail.com>
> On Dec 14, 4:48 am, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
>> - you have to close server.stdin when you don't have more data to send.
>> The server will see an end-of-file and knows it has to exit the loop.
>> Same thing on the client side.
> Hi Gabriel, thanks for modifying the code to make it work. I've just
> tried tinkering with it to see how far it would go. On your two
> statements above: does this means that any data must be sent in one
> batch and then the subprocess must shut down? What I was trying to
> simulate is a client/server relationship through a subprocess, where
> the server (the subprocess) keeps listening and the client sends data
> when it wants to (and eventually viceversa). But when the
> server.stdin.close() statement is issued, the pipe is closed for good
> and can't be reopened (can it?).
No, not at all. You can keep writing things to the pipe - as long as the
read side keeps reading, there is no limit on how much data you can send.
Just make sure you close the writing side of the pipe when you have no
more data to send, to signal the other side it's OK to exit the read loop.
>> - you have to wait until the server answers, else it will get a "broken
>> pipe" error or similar.
> So, if I want to interrogate the subprocess multiple times I must end
> and restart the ListenerThread multiple times then?
No, I mean, since your example is bidirectional, the parent process must
still be alive and able to read when the subprocess replies. Given this
parent writes "hi sub!"
child reads "hi sub!"
child writes "hi dad!"
parent reads "hi dad!"
if the parent just exits after sending "hi sub!", the child will get an
error when replying (I think it says "invalid handle" on Windows, "broken
pipe" on Linux, or something like this).
More information about the Python-list