python-Cython扩展类:如何在自动生成的C结构中公开方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-Cython扩展类:如何在自动生成的C结构中公开方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2640字,纯文字阅读大概需要4分钟。
内容图文
![python-Cython扩展类:如何在自动生成的C结构中公开方法?](/upload/InfoBanner/zyjiaocheng/694/33684918f72b4a36b8c5c0ff08378238.jpg)
我已经有了定义某些需要使用的类的C代码,但是我需要能够将这些类发送给Python代码.具体来说,我需要在C中创建类实例,创建Python对象以用作这些C对象的包装,然后将这些Python对象传递给Python代码进行处理.这只是大型C程序的一部分,因此最终需要使用C / Python API在C中完成.
为了使生活更轻松,我使用Cython定义了扩展类(cdef类),这些扩展类用作C对象的Python包装器.我使用的典型格式是cdef类包含指向C类的指针,然后在创建cdef类实例时对其进行初始化.由于如果我要包装现有的C对象,我也希望能够替换该指针,因此我在cdef类中添加了一些方法来接受()C对象并获取其指针.我的其他cdef类在Cython中成功使用了accept()方法,例如,当一个对象拥有另一个对象时.
这是我的Cython代码的示例:
MyCPlus.pxd
cdef extern from "MyCPlus.h" namespace "mynamespace":
cdef cppclass MyCPlus_Class:
MyCPlus_Class() except +
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
当我尝试从C访问accept()方法时,问题就来了.我尝试在cdef类和accept()方法上使用public和api关键字,但无法弄清楚如何在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;
};
我还尝试将自我输入键入为Py_Class,甚至尝试使用public和api关键字向前声明Py_Class.我还尝试过使accept()成为静态方法.我尝试过的任何工作都无法公开accept()方法,以便可以从C使用它.我确实尝试通过__pyx_vtab访问它,但出现编译器错误,“无效使用不完整类型”.我已经搜索了很多,但是还没有找到解决方案.谁能帮我?谢谢,麻烦您了!
解决方法:
正如您在comment中指出的那样,__pyx_vtab成员似乎只供Cython使用,因为它甚至没有在导出的标头中为其定义结构类型.
除了您的回应外,一种方法还可以是:
cdef api class Py_Class [object Py_Class, type Py_ClassType]:
...
cdef void accept(self, MyCPlus.MyCPlus_Class &indata):
... # do stuff here
...
cdef api void (*Py_Class_accept)(Py_Class self, MyCPlus.MyCPlus_Class &indata)
Py_Class_accept = &Py_Class.accept
基本上,我们定义一个函数指针并将其设置为我们要公开的扩展方法.这与响应的cdef功能没有太大不同;主要的区别在于我们可以在类定义中照常定义我们的方法,而不必重复功能或对另一个函数的方法/函数调用以公开它.需要注意的是,除了self的扩展类型(在这种情况下)等之外,我们几乎必须逐字定义方法指针的签名.同样,这也适用于常规功能.
请注意,我已经在C级Cython .pyx文件上进行了尝试,但没有尝试在CPP实现文件上进行测试.但我想,希望这可能同样有效.
内容总结
以上是互联网集市为您收集整理的python-Cython扩展类:如何在自动生成的C结构中公开方法?全部内容,希望文章能够帮你解决python-Cython扩展类:如何在自动生成的C结构中公开方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。