Linux上管道的Python readline

时间:2011-05-31 21:28:02

标签: python pipe readline

使用os.pipe()创建管道时,它会返回2个文件编号;读取结束和写入结束,可以使用os.write() / os.read()写入和读取表单;没有os.readline()。是否可以使用readline?

import os
readEnd, writeEnd = os.pipe()
# something somewhere writes to the pipe
firstLine = readEnd.readline() #doesn't work; os.pipe returns just fd numbers

简而言之,当你拥有的是文件句柄号时,是否可以使用readline?

5 个答案:

答案 0 :(得分:11)

您可以使用os.fdopen()从文件描述符中获取类似文件的对象。

import os
readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
firstLine = readFile.readline()

答案 1 :(得分:4)

将管道从os.pipe()传递给os.fdopen(),这应该从filedescriptor构建一个文件对象。

答案 2 :(得分:4)

听起来您想要获取文件描述符(数字)并将其转换为文件对象。 fdopen函数应该这样做:

import os
readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
# something somewhere writes to the pipe
firstLine = readFile.readline()

现在无法对此进行测试,请告诉我它是否无效。

答案 3 :(得分:4)

os.pipe()返回文件描述符,因此你必须像这样包装它们:

readF = os.fdopen(readEnd)
line = readF.readline()

有关详细信息,请参阅http://docs.python.org/library/os.html#os.fdopen

答案 4 :(得分:1)

我知道这是一个老问题,但这是一个没有死锁的版本。

import os, threading

def Writer(pipe, data):
    pipe.write(data)
    pipe.flush()


readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
writeFile = os.fdopen(writeEnd, "w")

thread = threading.Thread(target=Writer, args=(writeFile,"one line\n"))
thread.start()
firstLine = readFile.readline()
print firstLine
thread.join()