通过Windows上的ctypes将文件描述符传递给C库函数

时间:2012-02-08 20:03:44

标签: python windows ctypes file-descriptor

我试图通过ctypes将文件描述符传递给C函数,在C函数中对fd执行写操作。在linux上它可以工作。在Windows上它没有,我不明白为什么(我没有在Windows上作为开发人员的经验)

//C func signature: 
void fun(struct bah *opaque, int fd)
来自python的

(详见ommited):

mylib.fun.argtypes = [POINTER(bah), c_int]
fh = open(filename,'wb')
#doesn't work on windows, works on linux/unix
mylib.fun(some_ctypes_struct, fh.fileno())
#doesn't work on windows
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK)
#doesn't work
mylib.fun(bah_struct, os.open(...))

程序在write()s上因断言失败而死亡_osfile(fh)& FOPEN

cl.exe:16.00.40219.01 for x86 python 2.7.2 msc v.1500 32bit

我该怎么办呢?不,我不想将open()卸载到lib。我想以安全的方式传递一个已打开的文件描述符,与平台无关。


其他信息,以防万一: 这个库是tinycdb,我将它快速移植到具有短cmake规范和几个脏补丁的窗口,以使getopt和dll导出工作。库和exe工具按预期工作(测试)。 tinycdb的python ctypes包装器可以按预期在linux上运行。窗户给了我眼球。他不会接受fd是一个有效的描述符,即使我在用自己的(msvcrt)_open libcall打开它之后传递它。


当然,如果我在库中打开()/关闭()文件但是我无法更改API,一切正常。

1 个答案:

答案 0 :(得分:4)

Windows不像Unix那样使用文件描述,所以我假设文件描述符是由C运行时模拟的。如果您使用两个不同的C运行时(例如,如果您的EXE和DLL由不同的编译器编译,或者使用相同的编译器但具有不同的选项),则每个运行时将具有其自己的“文件描述符模拟”并且您可以' t将描述符从一个传递给另一个。