gpt4 book ai didi

python - Python 中的选择和管道问题

转载 作者:行者123 更新时间:2023-11-28 17:45:29 24 4
gpt4 key购买 nike

作为对上一篇不幸死亡的帖子的扩展: select.select issue for sockets and pipes .自从这篇文章以来,我一直在尝试各种方法都无济于事,我想看看是否有人知道我哪里出错了。我正在使用 select() 模块来识别数据何时出现在管道或套接字上。 socket 似乎工作正常,但事实证明管道有问题。

我已经按如下方式设置了管道:

pipe_name = 'testpipe'
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)

管道读取的是:

pipein = open(pipe_name, 'r')
line = pipein.readline()[:-1]
pipein.close()

它作为一段独立的代码完美地工作,但是当我尝试将它链接到 select.select 函数时它失败了:

inputdata,outputdata,exceptions = select.select([tcpCliSock,xxxx],[],[])

我尝试在输入数据参数中输入“pipe_name”、“testpipe”和“pipein”,但我总是收到“未定义”错误。查看其他各种帖子,我认为这可能是因为管道没有对象标识符,所以我尝试了:

pipein = os.open(pipe_name, 'r')
fo = pipein.fileno()

并在 select.select 参数中放入“fo”但得到了一个TypeError: an integer is required。在使用“fo”的这种配置时,我也遇到了错误 9:错误的文件描述符。任何我做错的想法都将不胜感激。

编辑代码:我设法找到了解决它的方法,尽管不确定它是否特别整洁 - 我会对任何评论感兴趣 -修改后的管道设置:

pipe_name = 'testpipe'
pipein = os.open(pipe_name, os.O_RDONLY)
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)

管道读取:

def readPipe()
line = os.read(pipein, 1094)
if not line:
return
else:
print line

监控事件的主循环:

inputdata, outputdata,exceptions = select.select([tcpCliSock,pipein],[],[])
if tcpCliSock in inputdata:
readTCP() #function and declarations not shown
if pipein in inputdata:
readPipe()

一切正常,我现在唯一的问题是在 select 的任何事件监视开始之前让代码从套接字中读取。一旦与 TCP 服务器建立连接,就会通过套接字发送一条命令,我似乎必须等到第一次读取管道后才能通过此命令。

最佳答案

根据docs , select 需要来自 os.open 或类似文件的文件描述符。因此,您应该使用 select.select([pipein], [], []) 作为您的命令。

或者,如果您使用的是 linux 系统,则可以使用 epoll

poller = epoll.fromfd(pipein)
events = poller.poll()
for fileno, event in events:
if event is select.EPOLLIN:
print "We can read from", fileno

关于python - Python 中的选择和管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786128/

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