我目前正在使用 Cython 包装一个库。为此,我想重用纯 C 绑定的一个函数。
这是基本设置:
在 mylib.pxd 中我这样做:
cdef extern from old_lib.h:
PyObject* get_pyobject()
Run Code Online (Sandbox Code Playgroud)
然后old_lib.c作为源文件传递到我的扩展中:
setup(ext_modules=[Extension("mylib", sources=["mylib.pxd", "old_lib.c"])])
Run Code Online (Sandbox Code Playgroud)
在 mylib.pxd 中,我使用get_pyobject它创建一个我想要返回的新对象,如下所示:
cdef PyObject* ptr
ptr = get_pyobject()
return <object>ptr
Run Code Online (Sandbox Code Playgroud)
这给了我想要的行为,但我担心这会泄漏 ptr 引用。
会吗?我很困惑,因为我发现(旧)引用说你应该自己管理 PyObject* 引用并相应地调用 Py_INCREF/DECREF 但似乎在 Cython FAQ中他们说:
请注意,对象的生命周期仅绑定到其拥有的引用,而不绑定到任何恰好指向它的 C 指针。
这是否意味着每当返回值被丢弃时,ptr就会被垃圾收集?
流程old_lib.c如下:
PyObject* get_pyobject()
{
PyTypedObject* typeptr = PyObject_NEW_VAR(MyType, &Type, size)
fill_attribute(typeptr->attrib)
return (PyObject*)typeptr
}
Run Code Online (Sandbox Code Playgroud)
PyObject_NEW_VAR在 python 标准库(我的版本中为 objimpl.h:196)中使用PyObject_InitVar. 因此,返回的引用是借用的引用,但根据 …