subprocess popen trouble
Gal Diskin
gal.diskin at gmail.com
Tue Jul 10 17:32:50 EDT 2007
Your code seems correct to me.
Just as a long shot - have you tried setting bufsize=0 ?
nik wrote:
> I am having trouble using subprocess popen and stdin/stdout
>
> I have the following simple test application written in C++, that just
> echoes back the stdin. It works fine running from the command line:
>
> #include <iostream>
> #include <time.h>
>
> int main (int argc, char * const argv[]) {
> int currenttemp = 0;
> int settemp = 0;
> char* str;
>
> while(currenttemp < 500){
> gets(str);
> sscanf(str, ">%d", &settemp);
> currenttemp = settemp;
> printf("<%d\n", currenttemp++);
> }
> return 0;
> }
>
> ######################################################
> Then I have the following python code. A listener thread that waits
> for the output of test and the main part that creates the subprocess
> Popen object, passes it to the thread and then sends user input to the
> subprocess test.
>
>
> import subprocess
> import os, sys
> from threading import *
> import time
>
> class TempXListen(Thread):
> """ thread to listen for incomming
> messages and put them onto a
> shared queue, no time lost processing incoming lines
> """
> def __init__(self, channel):
> """ connect internal response queue
> to external queue
> """
> Thread.__init__(self)
> self.setDaemon(True)
> self._channel = channel
> self.start()
>
> def run(self):
> """ listening loop
> reads line off of input source
> puts the line into the response Q shared with parent
> thread
> sets event that parent is waiting for to indicate Q has at
> least 1 element
> """
> while 1:
> try:
> response = self._channel.stdout.readline() #
> read input line
> print response
> except Exception, e:
> print 'Listener Exception: ' + str(e)
>
>
> print "Temp Monitor Test"
> tempx = subprocess.Popen('/Users/engineeringadmin/Documents/test/build/
> Debug/test', \
> bufsize=1, stdin=subprocess.PIPE,
> stdout=subprocess.PIPE, \
> stderr=subprocess.PIPE)
>
> print tempx.stderr.readline()
>
> listener = TempXListen(tempx)
> while 1:
> data = sys.stdin.readline()
> if data != '':
> data = '>' + data + '\n'
> tempx.stdin.write(data)
> print data
> time.sleep(1)
>
>
> ###############################################################
> When I run it this is the output:
>
> Temp Monitor Test
> warning: this program uses gets(), which is unsafe.
>
> 45
>
>> 45
>>
>
> ################################################################
> The subprocess is opened, because the warning is coming off of the
> test applications stderr, but nothing else seems to go in or out. I've
> been looking at a lot of examples and a lot of different postings, and
> can't see any mistakes in my use of subprocess. I would really
> appreciate it if somebody could see where I am going wrong.
>
> Thank you,
> Nik
>
>
-- Gal Diskin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20070711/5c2bba0c/attachment.html>
More information about the Python-list
mailing list