寻找将C++dll与Python结合的最佳方法

Looking for best way to Incorporate C++ dll with Python

本文关键字:最佳 方法 结合 Python C++dll 寻找      更新时间:2023-10-16

我有一个Python GUI应用程序,它需要包含一个稍微复杂的C++dll。我已经研究过boost.python,但遇到了困难,因为该程序包含5个单独的C++文件,而且我以前没有C++编码经验。我能够得到一个与Python一起工作的测试"Hello World"C++dll,但与我需要的dll相比,C++代码很简单。

我已经获得了用于Visual Basic项目的dll,但正在为Python中的同一应用程序寻找最佳解决方案。

最好尝试在Python中完全重写C++代码,还是尝试正确编码boost.Python包装器?如果在python中重写代码所需的时间与编写包装器代码所需时间相当,那么是否更倾向于完全重写代码?

将dll代码从编译语言转换为解释语言是否会显示出更多的负面影响而非正面影响?

提前谢谢你,

Garrett

大约一年前,作为一名新手/中级C++程序员,我开始使用boost.python,我对自己继续使用它的决定感到非常高兴。学习曲线很陡峭,但一旦学会如何浏览在线文档,它就会逐渐变缓。我时不时会遇到麻烦,但我在如何正确使用boost.python方面找到了最好的帮助,就像之前在SO和独立博客上提出的问题一样。以太网上有大量的在线文档。

最好尝试在Python中完全重写C++代码,还是尝试正确编码boost.Python包装器?

这取决于:

1) C++DLL做了多少"繁重的工作"。

2) 从Python传递到C++DLL的参数类型。

3) 您需要多久交付一个工作版本的代码。

如果你正在创建C++对象的实例,从python中调用其成员,并返回numpy数组,这相对简单。如果你需要在C++中操作PyObjects,那么它可能会变得有点棘手。如果你需要做后者,准备投入更多的时间和精力。

此外,请记住,当您创建dll时,二进制文件将与相同主要版本中的微版本兼容。我过去在一台安装了Python2.7的机器上运行*.so时遇到了可移植性问题,当时它与Python2.6库链接。参见:

Boost Python可移植性问题

根据我的经验,最简单的方法是ctypes:http://docs.python.org/2/library/ctypes.html

只要你能用几个C函数表达你的界面,这就行了。对于大多数C++库来说,这很容易,只要你不需要为使用它而对类进行子类化

优点:

  • 您编译DLL时不需要对python进行任何特殊考虑(因此您不会遇到另一个答案中提到的版本控制问题https://stackoverflow.com/a/18606365/1413374)
  • 您不依赖于第三方框架,如boost或swig
  • 无论如何,出于ABI稳定性的原因,为DLL提供一个C接口是一件好事。(添加类成员会更改C++类的ABI,即使它们是私有的)

我该怎么做?Ctypes是我看的第一件事但我从各个地方得到的印象是,它不会使用C++dll可以正常工作。

您声明您的函数extern "C"。这是最简单的部分,你可以在任何一本好的C++书中找到细节。困难的部分是以一种不需要C++特性(如模板或继承)的方式设计接口。"抽象数据类型"(ADT)是这类事物的一个很好的设计原则。查一下。要获得更详细的帮助,如果您可以发布C++库的接口或其中的一部分,这将有所帮助,因此我们可以通过示例进行解释。

另一个问题是C++运行时。它必须以某种方式链接到您的DLL。如果你有linux,我建议你使用libtool。我不了解Windows。也许它只是起作用。如果没有,请将错误消息放入您喜爱的搜索机中。