【问题标题】:Python binding of functions within a c++ programc++ 程序中函数的 Python 绑定
【发布时间】:2016-07-27 20:45:52
【问题描述】:

我有一个用 C++ 编写的程序,它自己运行,但是我们想让 Python 可以访问它。具体来说,我们有几个在 c++ 中更高效的函数,但是我们使用 Python 脚本对输出做了很多其他的事情。我不想在 Python 中重写整个 main(),因为我们使用了 Boost 的根查找算法和其他在 Python 中很难做到的功能。

是否可以在保留 c++ main() 的同时将 Python 绑定添加到这些函数?我以前从未做过 Python 绑定,但我看过 Boost.python,因为我们已经在使用 Boost。大多数示例在 hpp 文件中使用 c++ 函数/类并将它们嵌入到 python 程序中,这并不是我们想要的。

我们想要的是将我们的 c++ 程序保持为独立的,这样它就可以根据用户的需要按原样运行,并且还允许用户从 Python 程序中调用这些函数。能够使用相同的 Makefile 和 exe 会很棒。我们真的不想制作一个单独的包含绑定函数的 c++ 库;我们对制作 Python 版本的代码不感兴趣,只是允许访问这些有用的功能。

谢谢

【问题讨论】:

  • 你可能需要 GObject Introspection 库。
  • 至少在 Cython 中,可以有像“C++ main -> C 函数在 cython 中实现 -> python 代码 -> python 模块在 cython 中实现 -> C++ 代码......”这样的调用链。 Boost.python 也有可能。
  • 值得指出的是,对于 C/C++ 主程序来说,除了解析参数然后使用解析结果调用实际处理之外,它通常被认为是一种很好的做法——这使你正在考虑做,或任何绑定,更容易。

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


【解决方案1】:

我们有一个扩展的 c++ 库,我们通过使用一个调用我们在 boost python 中定义的接口的 python 包装类来提供给 python。

一个python类以pythonic方式处理所有查询,通过调用一个用c++编写的python扩展模块和boost python。 python 扩展执行 c++ 代码,因此它可以链接和使用原始库中的任何内容。

不过,您说您的 c++ 是可执行文件。为什么不能使用系统调用来启动 shell 进程?你可以用任何语言做到这一点,包括 python。我认为您想要访问单个函数,这意味着您需要静态库中的所有函数。

您正常构建您的 c++ exe,链接公共代码。您制作了一个链接公共代码的“boost python 扩展模块”,并且可以通过 python 脚本导入。当然还有一个单元测试可执行文件,它链接和测试公共代码。我的偏好是公共代码是独立的静态库(如果有 posix gcc 构建,请使用 -fPic)。

【讨论】:

  • 可能值得一提的是使用共享库 (.dll/.so) 作为一种可能性以及静态库。
  • python 扩展模块是(并且必须是)一个共享库(.pyd/.so)。底层代码库必须与该(-fPic)兼容,但使其也共享意味着您必须分发它并且没有任何版本/接口不匹配。没有收益的风险。
  • 请注意,上面的答案提到将 static 库链接到 python 代码 - 这是错误的。您还可以为 C++ 可执行文件和共享库构建静态库以捆绑到带有 python 接口的轮子中。
  • 我愿意纠正任何错误,但我认为我们只是沟通不畅。 Python 不链接,但它可以导入共享库(python 扩展模块)。当这个共享库是从 c++ 构建的时,其他共享或静态库可能已经被链接(这就是你的 c++ 代码库的来源)。
  • 我编辑了我的答案,将我的建议与我们同意的观点区分开来。而且我确实承认 makefile 实现了一次构建源代码的相同目的。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多