2012-06-07 3 views
1

제 질문은 프로세스를 생성 한 후 하위 프로세스가 루핑되어 표준 입력에서 데이터를 가져 오는 것입니다. Echo.Process.pipes [0] .write (data) 또는 Echo.Process.writeToChild (0, data) 중 하나를 사용하여 새 데이터를 쓰고 싶습니다. 그러나 둘 다 작동하지 않습니다. 누군가가 무슨 일이 일어나고 있는지 설명해 주시겠습니까? 또는이 문제를 어떻게 해결합니까?Twisted 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

각 들어오는 연결에 새로운 프로세스를 생성하고 모든 입력 데이터를 리디렉션 프로세스 '표준 :

#!/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

childFDsspawnProcess으로 전달하지 말고 결과 프로세스 전송 객체의 pipes 속성을 사용하지 마십시오. 이 모든 것들은 당신이 생각하는 것을하지 않습니다. childFDs의 사용을 중단하고 writeToChild으로 다시 전환하면 원하는 동작을 얻게됩니다.

관련 문제