[Twisted-Python] ProcessProtocol randomly not returning all of stdout
Justin Johnson
justinjohnson at gmail.com
Thu Jan 13 12:47:05 MST 2005
I recently started running into a problem where my process protocol
isn't extracting stdout accurately in all cases. I have a method on a
service that loops through a list and runs a command, passing in each
item on the list one at a time. Out of ~50 items in the list, and
thus ~50 invocations of the command, one or two will fail to extract
all of stdout from the command. Instead the first character of stdout
is extracted and that is it.
The process protocol I'm using is below. Does anyone see anything
wrong with the code? I am using the win32event reactor and Twisted
1.3.0.
from twisted.internet import reactor
from twisted.internet import protocol, error, defer
from twisted.python import log
from ratcontrol import errors, config
import os, sys
class BasicProcessProtocol(protocol.ProcessProtocol):
def __init__(self):
self.deferred = defer.Deferred()
self.stdout = ""
self.stderr = ""
self.status = 0
def connectionMade(self):
self.transport.closeStdin()
def outReceived(self, data):
self.stdout += data
def errReceived(self, data):
self.stderr += data
def processEnded(self, reason):
if reason.check(error.ProcessDone):
self.status = 0
# pass the items we want down the callback chain
self.deferred.callback((self.status, self.stdout, self.stderr))
else:
self.status = 1
theError = errors.CmdError(self.cmd, self.status,
self.stdout, self.stderr)
log.msg(theError)
self.deferred.errback(theError)
def openProcess(cmd_and_args):
cmd = cmd_and_args[0]
args = cmd_and_args[1:]
# Spawn the process using the reactor so we don't block
proto = BasicProcessProtocol()
proto.cmd = cmd_and_args
reactor.spawnProcess(proto, cmd, cmd_and_args, env=os.environ)
return proto.deferred
More information about the Twisted-Python
mailing list