0

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

我已经让 dll 与 Visual Basic 项目一起工作,但我正在为 Python 中的同一应用程序寻找最佳解决方案。

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

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

先感谢您,

加勒特

4

2 回答 2

0

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

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

这取决于:

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

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

3) 您需要多长时间交付代码的工作版本。

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

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

提升 Python 可移植性问题

于 2013-09-04T05:54:26.530 回答
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。也许它只是工作。如果没有,请将错误消息放入您最喜欢的搜索机中。

于 2013-09-04T19:07:13.990 回答