![]() |
1
2
这里的问题是
一
如果需要传递指向某个C对象的指针,则必须将其包装在一个Python对象中。有三种方法可以做到这一点,从黑客到最可靠。
首先,你可以把
这非常容易实现。但这意味着这些对象将与Python端的数字完全相同,因为它们就是这样。
显然,您不能将方法附加到此数字;相反,您的API必须是一个接受数字的自由函数,然后将该数字强制转换回
它更像,例如,C's
但更糟糕的是,由于没有类型检查(静态或动态)来保护您免受某些Python代码意外传递给您的数字的影响
如果您希望Python的垃圾收集器能够帮助您了解对象何时仍然被引用,那么您就走运了。您需要让您的用户手动跟踪号码并拨打一些
实际上,这并不比从
更好的解决方案是
如果你没读过
capsules
你至少需要略读一下主要章节。但最基本的想法是
所以,它几乎和传递数字一样简单,但解决了大多数问题。胶囊是不透明的值,您的python用户不能意外地对其进行算术;它们不能发送给您
但是你仍然不能将任何行为附在胶囊上。
因此,您的API仍然必须是
最后,可以为包含
这是更多的工作。如果你还没有阅读 Defining Extension Types 你需要通读整章。 但这意味着您有一个实际的Python类型,以及与之配套的所有内容。
你可以给它一个
如果你愿意使用C++,或者D,或者锈,而不是C,有一些很棒的库(pycxx,Booo::python,pyd,锈蚀python等)可以为你做大部分的样板。您只需声明您想要一个Python类,以及如何将其属性和方法绑定到C属性和方法中,并且可以得到像C++类一样使用的东西,除了它实际上是一个
或者你可以用
Cython
它允许您用基本上是Python的语言编写C扩展模块,但扩展到与C代码的接口。所以你的包装类只是一个
或者,根据用户的建议,您也可以使用
SWIG
为您生成C绑定。对于简单的情况,它是非常琐碎的,只需将它作为C API提供,它就可以返回代码来构建Python。
|
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |