Twisted Python:无法写入正在运行的衍生进程 [英] Twisted Python: Cannot write to a running spawned process

查看:40
本文介绍了Twisted Python:无法写入正在运行的衍生进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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(data) or Echo.Process.writeToChild(0,data), but both do not work. Would someone explain what's going on? Or how do I go around this problem?

这是我得到的错误:

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

谢谢,

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

推荐答案

在每个传入连接上创建一个新进程并将所有输入数据重定向到进程的标准输入:

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

这篇关于Twisted Python:无法写入正在运行的衍生进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆