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:
--- <exception caught here> ---
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()