My question is, after spawning a process, the child process is looping to get data from its stdin. I would like to write new data to it using either Echo.Process.pipes[0].write(
To create a new process on each incoming connection and to redirect all input data to the process' stdin:
#!/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()
Don't pass childFDs
to spawnProcess
and don't use the pipes
attribute of the resulting process transport object. Neither of these things does what you think. If you drop the use of childFDs
and switch back to writeToChild
, you'll get the behavior you want.