我现有的 C++ 代码定义了我需要使用的一些类,但我需要能够将这些类发送到 Python 代码。具体来说,我需要在 C++ 中创建类实例,创建 Python 对象作为这些 C++ 对象的包装器,然后将这些 Python 对象传递给 Python 代码进行处理。这只是较大的 C++ 程序的一部分,因此最终需要使用 C/Python API 在 C++ 中完成。
为了让我的生活更轻松,我使用 Cython 定义了作为 C++ 对象的 Python 包装器的扩展类(cdef 类)。我使用的典型格式是 cdef 类包含一个指向 C++ 类的指针,然后在创建 cdef 类实例时对其进行初始化。因为如果我有一个现有的 C++ 对象要包装,我也希望能够替换指针,所以我已经向 C++ 对象的 cdef 类添加了方法accept()并获取它的指针。我的其他 cdef 类成功地使用了accept()Cython 中的方法,例如当一个对象拥有另一个对象时。
这是我的 Cython 代码示例:
MyCPlus.pxd
cdef extern from "MyCPlus.h" namespace "mynamespace":
cdef cppclass MyCPlus_Class:
MyCPlus_Class() except +
Run Code Online (Sandbox Code Playgroud)
PyModule.pyx
cimport MyCPlus
from libcpp cimport bool
cdef class Py_Class [object Py_Class, type PyType_Class]:
cdef MyCPlus.MyCPlus_Class* thisptr
cdef bool owned
cdef void accept(self, MyCPlus.MyCPlus_Class &indata):
if self.owned:
del self.thisptr
self.thisptr = &indata
self.owned = False
def __cinit__(self):
self.thisptr = new MyCPlus.MyCPlus_Class()
self.owned = True
def __dealloc__(self):
if self.owned:
del self.thisptr
Run Code Online (Sandbox Code Playgroud)
当我尝试accept()从 C++访问该方法时,问题就出现了。我尝试在我的 cdef 类和方法上使用publicandapi关键字accept(),但我无法弄清楚如何在 Cython 自动生成的.h文件的 C 结构中公开此方法。无论我尝试什么,C 结构看起来像这样:
PyModule.h (由 Cython 自动生成)
struct Py_Class {
PyObject_HEAD
struct __pyx_vtabstruct_11PyModule_Py_Class *__pyx_vtab;
mynamespace::MyCPlus_Class *thisptr;
bool owned;
};
Run Code Online (Sandbox Code Playgroud)
我还尝试将self输入输入为 a Py_Class,我什至尝试Py_Class使用publicandapi关键字进行前向声明。我还尝试制作accept()静态方法。我尝试过的任何accept()方法都无法公开该方法,以便我可以从 C++ 中使用它。我确实尝试通过 访问它__pyx_vtab,但出现编译器错误,“不完整类型的无效使用”。我已经搜索了很多,但还没有看到解决方案。谁能帮我?谢谢,麻烦您了!
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |