Python retorcido: no se puede escribir en un proceso generado en ejecución

Mi pregunta es que, después de generar un proceso, el proceso hijo está en bucle para obtener datos de su stdin. Me gustaría escribir nuevos datos usando Echo.Process.pipes [0] .write (data) o Echo.Process.writeToChild (0, data), pero ambos no funcionan. ¿Alguien explicaría lo que está pasando? ¿O cómo puedo solucionar este problema?

Este es el error que tengo:

---  --- File "/usr/local/encap/python-2.6.4/lib/python2.6/site-packages/Twisted-9.0.0-py2.6-linux-x86_64.egg/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite why = getattr(selectable, method)() File "/usr/local/encap/python-2.6.4/lib/python2.6/site-packages/Twisted-9.0.0-py2.6-linux-x86_64.egg/twisted/internet/tcp.py", line 460, in doRead return self.protocol.dataReceived(data) File "pp1.py", line 30, in dataReceived Echo.Process.pipes[0].write(data) exceptions.KeyError: 0 

Gracias,

Q

 from sys import executable from os import environ import os from twisted.internet import reactor from twisted.internet.protocol import Protocol from twisted.internet.protocol import Factory from twisted.internet import protocol import sys implementation = """\ import os import time import sys print "in child", os.getpid() while (True): a = raw_input("") if a: print a """ class Echo(Protocol): Process = None def dataReceived(self, data): if Echo.Process == None: pp = MyPP() Echo.Process = reactor.spawnProcess(pp, executable, [executable, "-c", implementation, data], env=environ, childFDs = {0:1, 1:1, 2:2}) else: Echo.Process.pipes[0].write(data) #Echo.Process.writeToChild(0,data) self.transport.write(data) class EchoFactory(Factory): def buildProtocol(self, addr): return Echo() class MyPP(protocol.ProcessProtocol): def connectionMade(self): print "connectionMade!" def outReceived(self, data): print "out" def errReceived(self, data): print "error", data def processExited(self, reason): print "processExited" def processEnded(self, reason): print "processEnded" print "quitting" reactor.listenTCP(8200, EchoFactory()) print 'in parent', os.getpid() reactor.run() 

Para crear un nuevo proceso en cada conexión entrante y redirigir todos los datos de entrada a la entrada estándar del proceso:

 #!/usr/bin/python from twisted.internet import reactor from twisted.internet import protocol class Echo(protocol.Protocol): def connectionMade(self): self.pp = MyPP() reactor.spawnProcess(self.pp, 'cat', ['cat']) def dataReceived(self, data): self.pp.transport.write(data) def connectionLost(self, reason): self.pp.transport.loseConnection() class MyPP(protocol.ProcessProtocol): def connectionMade(self): print "connectionMade!" def outReceived(self, data): print "out", data, def errReceived(self, data): print "error", data, def processExited(self, reason): print "processExited" def processEnded(self, reason): print "processEnded" print "quitting" factory = protocol.Factory() factory.protocol = Echo reactor.listenTCP(8200, factory) reactor.run() 

No pase childFDs a spawnProcess y no use el atributo pipes del objeto de transporte de proceso resultante. Ninguna de estas cosas hace lo que piensas. Si abandona el uso de childFDs y vuelve a writeToChild , obtendrá el comportamiento que desea.