Help need with subprocess communicate

Daniel Klein danielk at featherbrain.net
Thu Jun 5 14:11:14 EDT 2008


On Tue, 3 Jun 2008 23:48:38 -0700 (PDT), rdabane at gmail.com wrote:

>On Jun 3, 11:23 pm, Dennis Lee Bieber <wlfr... at ix.netcom.com> wrote:
>> On Tue, 3 Jun 2008 18:04:40 -0700 (PDT), rdab... at gmail.com declaimed the
>> following in comp.lang.python:
>>
>>
>>
>> > Hi Daniel,
>> > Thanks for your reply..
>> > I've done exactly as you suggested...but I'm still having problem with
>> > the read...it just gets stuck in
>> > the read ( I think because its a blocking read...)
>>
>>         And it is likely blocking because the subprocess is doing buffered
>> output -- ie, nothing is available to be read because the output has not
>> been flushed.
>>
>>         This is a problem with most programs when run as a subprocess -- it
>> is common for stdout, when routed to a pipe or file, to behave as a
>> buffered stream that only flushes when some x-bytes have been written;
>> unlike stdout to a console which gets flushed on each new-line.
>> --
>>         Wulfraed        Dennis Lee Bieber               KD6MOG
>>         wlfr... at ix.netcom.com              wulfr... at bestiaria.com
>>                 HTTP://wlfraed.home.netcom.com/
>>         (Bestiaria Support Staff:               web-a... at bestiaria.com)
>>                 HTTP://www.bestiaria.com/
>
>
>Is there way to configure the stdout buffer size so that it flushes
>earlier..
>Is there a way to make above mentioned piece code working?

I'm not so sure it is a buffer problem. To test this out I first created a
'p2.py' script...

from subprocess import *
import os
p=Popen('ConsoleApplication1.exe',stdin=PIPE,stdout=PIPE,universal_newlines=True)
print p.stdout.readline()[:-1] # strip \n from end of line
p.stdin.write('hi' + os.linesep)
print p.stdout.readline()[:-1]
p.stdin.write('bye' + os.linesep)
print p.stdout.readline()[:-1]
p.stdin.close()
p.stdout.close()

I then created the following VB console application (this is the 'process'
that is being 'Popen'd and is in my %PATH%)...

Module Module1
    Dim x As String
    Sub Main()
        Console.WriteLine("Process started...")
        x = Console.ReadLine()
        Console.WriteLine(x)
        x = Console.ReadLine()
        Console.WriteLine(x)
    End Sub
End Module

Here is the output when I run it...

C:\home\python>python p2.py
Process started...
hi
bye

Note that I didn't have to 'flush()' anything.

I got the same thing working with a C program. I don't know why it won't
work with a similar python script...

import sys
sys.stdout.write('process started...\n')
r = sys.stdin.readline()
sys.stdout.write(r + '\n')
s = sys.stdin.readline()
sys.stdout.write(s + '\n')

I called this 'p3.py'. When I plug this into the 'p2.py' script I get
nothing, it just hangs. So maybe there is something else I am missing.

I normally don't do things this way cos there are os size limits to what you
can send/recv, so I use my own protocol (similar to netstrings)  for
communication.

Daniel Klein



More information about the Python-list mailing list