2012-06-07 16 views
1

我的问题是,在产生一个进程后,子进程正在循环以从其标准输入中获取数据。我想用Echo.Process.pipes [0] .write(data)或Echo.Process.writeToChild(0,data)向它写入新数据,但两者都不起作用。有人会解释发生了什么事吗?或者我该如何解决这个问题?扭曲的Python:无法写入正在运行的衍生进程

这是我得到的错误:

--- <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 

谢谢你,

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() 

回答

2

为每个传入的连接上创建一个新的进程和所有输入数据到重定向过程'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() 
0

请勿将childFDs转换为spawnProcess,也不要使用生成的过程传输对象的pipes属性。这些都不符合你的想法。如果您放弃使用childFDs并切换回writeToChild,您将获得所需的行为。