subprocess popen trouble

nik nikbaer at gmail.com
Tue Jul 10 12:43:57 EDT 2007


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




More information about the Python-list mailing list