gpt4 book ai didi

python - 扭曲的Python : Cannot write to a running spawned process

转载 作者:行者123 更新时间:2023-12-01 05:59:59 24 4
gpt4 key购买 nike

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

这是我得到的错误:

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

最佳答案

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

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

关于python - 扭曲的Python : Cannot write to a running spawned process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com