从无缓冲的os.fdopen()文件对象读取行为不像os.read()

时间:2015-06-29 10:51:17

标签: python file-descriptor

我有以下代码

r, w = os.pipe()
rf, wf = os.fdopen(r, 'rb', 0), os.fdopen(w, 'wb', 0)
wf.write('hello')

阅读时
rf.read(10)

它永远阻止。但是,如果我用

阅读它
os.read(r, 10)

它返回'hello'而不等待10个字节可用。

问题是:如何使.read()上的os.fdopen()'ed文件对象的行为相同? (又名非阻塞)

2 个答案:

答案 0 :(得分:2)

可能有更好的方法,但您可以使用fcntl module设置O_NONBLOCK

import fcntl

r, w = os.pipe()
fcntl.fcntl(r, fcntl.F_SETFL, os.O_NONBLOCK)
…

答案 1 :(得分:2)

使用io.open()代替os.fdopen()

解决了这个问题

请注意,您必须使用buffering=0才能生效:

rf = io.open(r, 'rb', 0)
rf.read(10)