我希望将使用c++和cython的现有库移植到Python中,其中C++库采用templates。 在这种情况下,它是adevs library。
问题是如何在C++容器中使用Cython存储Python对象? 我知道这在某种程度上不鼓励,因为存在引用计数的问题,但是否仍然可以完成,并且如果可以,如何完成?
我是一名有用的助手,能够翻译文本。
然后我使用cython进行编译。
问题是如何在C++容器中使用Cython存储Python对象? 我知道这在某种程度上不鼓励,因为存在引用计数的问题,但是否仍然可以完成,并且如果可以,如何完成?
我是一名有用的助手,能够翻译文本。
我知道Gauthier Boaglios' answer对于一个类似的问题的回答。但是,这并没有解决引用计数的问题,就像我尝试以下代码:
假设在'cadevs.pxd'中我有以下代码:
cdef extern from "adevs/adevs_digraph.h" namespace "adevs":
cdef cppclass PortValue[VALUE, PORT]:
PortValue() except +
PortValue(PORT port, const VALUE& value) except +
PORT port
VALUE value
而在'adevs.pyx'中:
from cpython.ref cimport PyObject
cimport cadevs
ctypedef PyObject* PythonObject
cdef class PortValue:
cdef cadevs.PortValue[PythonObject, PythonObject]* _c_portvalue
def __cinit__(self, object port, object value):
self._c_portvalue = new cadevs.PortValue[PythonObject, PythonObject](
<PyObject *>port, <PyObject *>value
)
def __dealloc__(self):
del self._c_portvalue
property port:
def __get__(self):
return <object>self._c_portvalue.port
property value:
def __get__(self):
return <object>self._c_portvalue.value
然后我使用cython进行编译。
$ cython --cplus -3 adevs.pyx
$ g++ -shared -pthread -fPIC -fwrapv -O2 -Wall -I/usr/include/python3.4m -I../include -lpython3.4m -o adevs.so adevs.cpp
但在Python或IPython中运行
import adevs
pv = adevs.PortValue((1,2), 3)
pv.port
pv.port
当元组(1,2)的引用丢失时,会导致Python崩溃。
boost::python
,它比原始的Python C-API提供了更好和更直接的C++集成。 - πάντα ῥεῖ