在Python中选择和管道麻烦

时间:2013-09-13 12:18:13

标签: python sockets select pipe

作为前一篇文章的延伸,遗憾的是似乎死了: select.select issue for sockets and pipes。自从这篇文章以来,我一直在尝试各种各样的事情无济于事,我想知道是否有人知道我哪里出错了。我正在使用select()模块来识别管道或套接字上何时存在数据。套接字似乎工作正常,但管道证明是有问题的。

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

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],[],[])

我尝试在inputdata参数中输入'pipe_name','testpipe'和'pipein',但我总是得到一个'not defined'错误。看看其他各种帖子我认为可能是因为管道没有对象标识符所以我试过了:

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

并将'fo'放在select.select参数中但得到 TypeError:需要一个整数。使用'fo'的配置时,我还有一个错误9:错误的文件描述符。任何想法我做错了将不胜感激。

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

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

Pipe read:

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服务器,就会通过套接字发送一个命令,我似乎必须等到管道在第一次被读取之前才会被读取。

1 个答案:

答案 0 :(得分:2)

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