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

时间:2013-09-03 22:00:56

标签: c++ python boost dll boost-python

我有一个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代码从编译语言转换为解释后的语言会显示出比正面更多的负面影响吗?

提前谢谢你,

盖瑞特

2 个答案:

答案 0 :(得分:0)

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

  

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

这取决于:

1)C ++ DLL正在做多少“繁重的工作”。

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

3)您需要多久才能提供代码的工作版本。

如果要创建C ++对象的实例,从python调用其成员,并返回numpy数组,这是相对简单的。如果你需要在C ++中运行PyObjects,那么它可以快速实现一点点棘手。如果您需要做后者,请准备投入更多的时间和精力。

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

Boost Python portability concerns

答案 1 :(得分:0)

根据我的经验,最简单的方法是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,我不知道。也许它只是有效。如果没有,请将错误消息放入您最喜欢的搜索机器中。