使用Cython命名临时文件

时间:2015-11-06 11:10:14

标签: cython

我正在寻找margin-top函数的$scope.max = Math.max.apply(null, Object.keys(data.lang).map(function(key) { return data.lang[key]; })); 模拟,以便在没有C的并行tempfile.NamedTemporaryFile()代码中使用它。理论上Cython函数可以解决这个问题:

GIL

但是,由于某种原因,它仍然不起作用,因为我在编译期间收到以下错误:

tmpnam

我不明白这个from cython import parallel from libc.stdio cimport FILE, tmpnam, fopen, fclose, fwrite from libcpp.string cimport string cdef save_obj(string obj): cdef char* fname cdef FILE* cfile with nogil, parallel.parallel(): fname = tmpnam(NULL) cfile = fopen(fname, "wb") fwrite(obj.data(), 1, obj.size(), cfile) fclose(cfile) 对象的来源,因为函数来自 with nogil, parallel.parallel(): fname = tmpnam(NULL) ^ ------------------------------------------------------------ testc2.pyx:9:23: Converting to Python object not allowed without gil

有人可以解释一下,为什么它仍然需要python C,我怎么能克服这个问题呢?

1 个答案:

答案 0 :(得分:1)

用于导入C标准库中的本机函数的所有Cython信息都来自pxd文件中的信息,类似于头文件。 Cython捆绑了C标准库头文件的几个pxd文件,包括stdio.pxd link。这是您从代码的第二行导入的内容。

如果您查看了该链接,您会发现tmpnam未在捆绑的stdio.pxd中定义,因此Cython猜测您是在该上下文中使用Python名称。您仍然可以导入该功能,但您必须提供原型:

cdef extern from "stdio.h" nogil:
   char* tmpnam(char*);