【问题标题】:Looking for best way to Incorporate C++ dll with Python寻找将 C++ dll 与 Python 结合的最佳方法
【发布时间】:2013-09-03 22:00:56
【问题描述】:

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

提前谢谢你,

加勒特

【问题讨论】:

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


    【解决方案1】:

    大约一年前,我作为一名新手/中级 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 库链接。见:

    Boost Python portability concerns

    【讨论】:

    • 感谢您的快速回复,我想我会更深入地研究它,看看情况如何。
    【解决方案2】:

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

    【讨论】:

    • 我该怎么做呢? Ctypes 是我研究的第一件事,但我从各个地方得到的印象是它不能与 C++ dll 一起正常工作。
    • 是的,我同意 ctype 很棒,因为它不依赖第三方库。但是学习曲线比boost要陡峭得多。需要记住的一些事情:你不能直接访问 C++ 成员(你必须为每个成员编写一个 C 包装器),内存管理有点棘手,并且它混淆了 Python 语法。 IMO,ctypes 非常适合小型项目。
    • 这就是我写的——只要你能用 C 语言轻松地表达你的接口,它就可以工作。学习曲线还不错。比 SWIG 更简单。我不知道 boost.python,没用过。
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多