reading stdout from child
Thomas Thiele
thiele at muc.das-werk.de
Wed Jul 26 07:37:01 EDT 2000
Hallo!
I have a python program. It works fine.
But: I wrote a second python program that should start these program
using popen to read it's stdout. And this works not fine, too.
But not always.
Sorry but it is little bit long.
First the wrapper ( I use my own popen for experiment ):
This program forks a child and should print it's stdoutput.
LOCALSTART.py
#------------------------------------------------------------------------------------
#! /usr/local/python/bin/python
import popen2, os, select, sys, string
class LocalWrapper:
def __init__(self):
self.listofchilds = []
def start(self, command):
self.startone(command)
def startone(self, command):
#create pipes for communication
p2cread, p2cwrite = os.pipe()
c2pread, c2pwrite = os.pipe()
errout, errin = os.pipe()
#fork new process
self.PID = os.fork()
if self.PID == 0: #**********child**********
#stdout und stdin
os.close(0)
os.close(1)
os.close(2)
if os.dup(p2cread) != 0:
sys.stderr.write('popen2: bad read dup\n')
if os.dup(c2pwrite) != 1:
sys.stderr.write('popen2: bad write dup\n')
if os.dup(errin) != 2: pass
for i in range(3, 256):
try: os.close(i)
except: pass
commlist = string.split(command, " ")
try: os.execvp( commlist[0], commlist )
finally: os._exit(1)
if self.PID > 0: #**********father**********
os.close(p2cread)
os.close(c2pwrite)
os.close(errin)
fout = os.fdopen(c2pread)
while 1:
stdoutput, errorout = "", ""
stdoutput = fout.readline() <------- ?????????
if stdoutput: print stdoutput,
if not stdoutput:
break
try: os.waitpid(self.PID, 0)
except OSError: print "no child" #pass
os.close(p2cwrite)
os.close(c2pread)
os.close(errout)
print "child is dead!!!!!!"
#******************************************
#*
Main *
#******************************************
if __name__ == "__main__":
import sys
argstr = sys.argv[1]
for arg in sys.argv[2:]: argstr = argstr + " " + arg
LocalWrapper().start(argstr)
#------------------------------------------------------------------------------------
second the main part from the other script LOCALSERVER.py.
It's actually a server derived from SocketServer.py with a class for
functionality
#------------------------------------------------------------------------------------
#******************************************
#*
Main *
#*******************************************
import sys
sys.stdout.write("HHHHHHAAAAAAAALLLLLLLLLLLLLLLOOOOOOOOOO!\n")
if __name__ == '__main__':
import os,sys,string
def usage():
print 'Usage: %s host port processors memory(mb)' %
os.path.basename(sys.argv[0])
if len(sys.argv) < 4:
usage()
else:
# Handle command line arguments
host = sys.argv[1]
port = string.atoi(sys.argv[2])
processors = string.atoi(sys.argv[3])
if len(sys.argv) >= 5: memory = string.atoi(sys.argv[4])
else: memory = 0
print "Starting local render server: Host: ", host, "Port: ", port,
"Process: ", processors, "RAM(mb): ", memory, "\n"
print "Version: ", VERSION, "\n"
executer = Local_Job_Executer(processors, memory, host) <-- this class
is not of interest
server = Local_Job_Server(host, port, executer) <-- derived from
SocketServer(multithreading)
server.serve_forever() <--- disabled: it works
#------------------------------------------------------------------------------------
When I call "LOCALSTART.py LOCALSERVER.py odin 1750 1" I expect to get
the normal screen output:
HHHHHHAAAAAAAALLLLLLLLLLLLLLLOOOOOOOOOO!
Starting local render server: Host: odin Port: 1750 Process: 1
RAM(mb): 0
Version: 25_07_2000_1
and from all other prints later in the program LOCALSERVER.py
but It works only if I disable server.serve_forever(). If the program
runs into the infinite loop I will get no output.
I cannot read the output in the warpper (see marked line <---??????? in
LOCALSTART.py).
Why? I expect that readline read when an output with newline at the end
was written?
Thank you for help
Thomas
More information about the Python-list
mailing list