Python FILE调用kevent函数时无错误

Python FILE调用kevent函数时无错误,python,kqueue,Python,Kqueue,我在Python2.7中使用kqueue构建了一个文件监视器 最初,它一直在输出标志中的0x4000和数据中的0x1,结果证明这是一个错误。然后我找到了由给出的一个示例,它是有效的 我的代码,给出错误 import select from time import sleep fd = open('test').fileno() kq = select.kqueue() flags = select.KQ_EV_ADD | select.KQ_EV_ENABLE | select.KQ_EV_

我在Python2.7中使用kqueue构建了一个文件监视器

最初,它一直在输出标志中的0x4000和数据中的0x1,结果证明这是一个错误。然后我找到了由给出的一个示例,它是有效的

我的代码,给出错误

import select
from time import sleep

fd = open('test').fileno()
kq = select.kqueue()

flags = select.KQ_EV_ADD | select.KQ_EV_ENABLE | select.KQ_EV_CLEAR
fflags = select.KQ_NOTE_DELETE | select.KQ_NOTE_WRITE | select.KQ_NOTE_EXTEND \
         | select.KQ_NOTE_RENAME | select.KQ_NOTE_REVOKE | select.KQ_NOTE_ATTRIB\
         | select.KQ_NOTE_LINK
ev = select.kevent(fd, filter=select.KQ_FILTER_VNODE,
                   flags=flags, fflags=fflags)


evl = kq.control([ev], 1)
print evl
while 1:
    revents = kq.control([], 1, None)
    print revents
    sleep(1)
在他的版本中,将file对象直接提供给kevent函数

fd = open('test')
ev = select.kevent(fd, filter=select.KQ_FILTER_VNODE,
                   flags=flags, fflags=fflags)
另一个版本,在kevent中调用fileno方法

fd = open('test')
ev = select.kevent(fd.fileno(), filter=select.KQ_FILTER_VNODE,
                   flags=flags, fflags=fflags)
但是现在我真的很困惑为什么第一个版本不起作用而第三个版本却很好。这两个应该是一样的,对吧

我的另一个问题是,Python中的文件对象到底是什么?我已经看到ident实际上是一个整数,它应该是文件描述符,而不是文件对象。这是怎么回事


谢谢

“不工作”的确切含义是什么?@e4c5不断生成标志=0x4000和数据=0x1,在手册页上找不到错误。可能是因为您没有任何对文件对象的引用,垃圾收集器关闭了它?@dizballanze您可能是对的,但在我调用gc.disable()之后,错误仍然存在。有没有其他方法来测试这是否是因为垃圾收集器?谢谢@xh4n3尝试在变量中保留对文件对象的引用