【发布时间】:2017-10-31 21:34:03
【问题描述】:
如何将使用def 定义的 Cython 方法中的 Python 对象参数转换为 C++ 类型?我正在尝试为 C++ 库提供 Cython 包装类,如 Cython 文档的 Using C++ in Cython 部分所述。
这是一个演示我的问题的示例。
文件foo.h:
namespace ns {
class Foo:
public:
Foo();
dosomething(std::shared_ptr<Bar>);
}
文件bar.h:
namespace ns {
class Bar:
public:
Bar();
}
文件foo.pyx:
from libcpp.memory cimport shared_ptr
cdef extern from 'bar.h' namespace 'ns':
cdef cppclass Bar:
Bar() except +
cdef extern from 'foo.h' namespace 'ns':
cdef cppclass Foo:
Foo() except +
void dosomething(shared_ptr[Bar])
cdef class PyBar:
cdef Bar* thisptr
def __cinit__(self):
self.thisptr = new Bar()
def __dealloc__(self):
del self.thisptr
cdef class PyFoo:
cdef Foo* thisptr
def __cinit__(self):
self.thisptr = new Foo()
def __dealloc__(self):
del self.thisptr
def dosomething(self, bar):
self.thisptr.dosomething(bar)
文件setup.py:
from setuptools import Extension
from setuptools import setup
from Cython.Build import cythonize
extensions = [
Extension(
'foo',
sources=[
'foo.pyx',
'foo.cpp',
'bar.cpp',
],
language='c++',
include_dirs=['.'],
extra_compile_args=['-std=c++11'],
),
]
setup(
ext_modules=cythonize(extensions),
)
我尝试编译时出现的错误:
$ python setup.py build_ext
Compiling foo.pyx because it changed.
[1/1] Cythonizing foo.pyx
Error compiling Cython file:
------------------------------------------------------------
...
def __dealloc__(self):
del self.thisptr
def dosomething(self, bar):
self.thisptr.dosomething(bar)
^
------------------------------------------------------------
foo.pyx:38:33: Cannot convert Python object to 'shared_ptr[Bar]'
【问题讨论】: