I need to run a cmd line app from python whose run time can vary from a
fraction of a second to minutes. I need to be able to tell whether the process
is still waiting, or whether it has stalled - and this is farily easily done by
keeping an eye on whether its writing to stdout or not. The process under
working conditions will write to stdout fairly regularly.
So I want to bail out waiting for the process if it is no longer writing to
stdout, but whenever I read stdout the script blocks and doesn't return until
the process has finished.
This is under windows, python 2.5. Can anyone help? The code I'm using is
below.
import subprocess
import time
TIMEOUT_PERIOD = 5 #timeout period in seconds
def run( *args ):
cmdStr = 'somePotentiallyLengthyCmdHere'
try:
proc = subprocess.Popen( cmdStr, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE )
except OSError:
return False
startTime = time.clock()
stdoutAccum = []
stderrAccum = []
hasTimedOut = False
while True:
ret = proc.poll()
newStdout = proc.stdout.read()
newStderr = proc.stderr.read()
print 'waiting...'
stdoutAccum += newStdout
stderrAccum += newStderr
#if the proc has terminated, deal with
returning appropriate data
if ret is not None:
if hasTimedOut:
if callable(
RETURNED_CALLBACK ):
try: RETURNED_CALLBACK( *args )
except: pass
return stdoutAccum + stderrAccum
#if there has been new output, the proc is
still alive so reset counters
if newStderr or newStdout:
startTime = time.clock()
#make sure we haven't timed out
curTime = time.clock()
if curTime - startTime > TIMEOUT_PERIOD:
hasTimedOut = True
--
http://mail.python.org/mailman/listinfo/python-list