用python包装C++代码(手动)

Wrapping C++ code with python (manually)

本文关键字:手动 代码 C++ python 包装      更新时间:2023-10-16

我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件将N(任何正整数)作为输入参数,通过使用头文件的函数,它给出输出说'x&y'(都是双精度)。

注意:

  1. 主文件和头文件都是用C++编写的。
  2. 主文件和头文件都使用特征库,而不是使用数据结构作为数组,向量

我必须为他们编写一个python包装器,我有python的工作知识,但从未使用过任何包装器。

任何人都可以参考或给出一些关于使用python wrpper进行此类代码的说明吗?

以下是您的选择:

  1. 你可以使用 ctypes,我认为这是最干净的解决方案,因为您可以将程序转换为可以由任何其他软件调用的共享库,而不仅仅是 Python。但是,您必须自己为程序编写一个C接口。

  2. 你可以使用Python C-Extension,我认为这是最糟糕的解决方案,因为它的级别非常低,容易出现内存泄漏,并且需要花费大量时间来实现一个函数,并且依赖于Python版本。基本上,这很好在C++内启动Python解释器。您可以创建 PyObjects(这是任何 Python 类型的主构建块)并在独立的 C/C++ 中处理它们。

  3. 您可以使用 SWIG,它通过您定义的接口文件自动创建您必须使用 ctypes 创建的接口。人们说它非常好,但文档没有那么好。

  4. 你可以使用 Boost.Python,这很好,但它有一个非常丑陋的 bjam 构建系统。如果你能设法绕过它,那么它甚至比ctypes更好。我是一个很大的助推粉丝,但 bjam 是我不使用它的原因。

我通常做的是ctypes。我相信它,因为它强调了单一责任原则。该库有一个独立于接口(C 接口)的作业,该接口也独立于使用该接口并向用户公开"简单功能"的 Python 脚本。

使用Boost.Python。 这是我的教程,以前在SO Docs上。


使用 Boost.Python

当您必须在 Python 项目中使用 C++ 库时,事情很容易。只是你可以使用提升。

首先,这里有您需要的组件列表:

  • CMakeList.txt 文件,因为您将使用 CMake。
  • C++项目的C++文件。
  • python文件 - 这是你的python项目。

让我们从一个小C++文件开始。我们的C++项目只有一个方法返回一些字符串"这是第一次尝试"。称之为CppProject.cpp

char const *firstMethod() {
return "This is the first try.";
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}

有一个CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line

通过本教程的这一部分,一切都变得如此简单。 您可以在 Python 项目中导入库和调用方法。将你的 python 项目称为MyProject.py

import NativeLib
print (NativeLib.getTryString)

要运行您的项目,请按照以下说明操作:

  • 创建名称为build的目录。
  • 输入该目录。
  • 将命令cmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py.现在,您必须查看C++项目中的方法返回的字符串。

另一个生成包装器C++的工具是 CLIF。谷歌于 2017 年发布,如今大多数事情都使用它。 我们不再允许在内部为 Python 编写新的 SWIG 包装器。

它建立在Clang之上,用于C++解析,需要相对惯用的现代C++API使用(毫不奇怪地遵循Google的风格指南),而不是试图通过SWIG的"糟糕地支持一切"方法让你搬起石头砸自己的脚。

尝试使用官方文档:

https://docs.python.org/2/extending/extending.html

此链接将为您提供有关如何包含 cpp 模块并从 Python 解释器使用它的简单示例,或者如果可能的话,请尝试使用 Cython:http://cython.org/

Cython将允许你编写类似C的,类似Python的代码,这些代码将被翻译成CPP编译,然后可以轻松地从Python访问。

你可以使用Boost.Python

或者使用 Python 原生接口

如果你已经设置了Boost,我会推荐Boost.Python。