[Twisted-Python] The case of the missing Traceback

Dan tw.1 at pyxos.com
Tue Nov 3 11:52:45 MST 2009


I was playing around with Twisted today and ran into a problem where 
Tracebacks aren't emitted on stderr after a deferred callback from a 
process called launched by reactor.spawnProcess.  The simplified test 
case is below.  I put "x = y" in the  callback function to generate 
an exception, y doesn't exist.  Uncomment "x = z" right before the 
callback and it produces the traceback on stderr just fine.

System is Linux, Python 2.6 and Twisted 8.2.



from twisted.internet import reactor, protocol, defer
import sys


def err(s):
     sys.stderr.write(s+'\n')
     sys.stderr.flush()


def test():
     err('test')
     cat = MyPP()
     reactor.spawnProcess(cat, "/bin/cat", ["cat", "-"], {})
     d = cat.send("Hello world")
     d.addCallback(response)


def response(resp):
     err('response called')
     x = y
     err(resp)


class MyPP(protocol.ProcessProtocol):
     def __init__(self):
         self.defer = defer.Deferred()

     def outReceived(self, data):
         err("outReceived! with %d bytes" % len(data))
         err("    %s" % data)
         self.defer.callback(data)

     def send(self, c):
         self.transport.write("%s\n" % c)
         #x = z
         return self.defer


if(__name__=='__main__'):
     reactor.callWhenRunning(test)
     reactor.run()







More information about the Twisted-Python mailing list