用python包装C++代码(手动)
Wrapping C++ code with python (manually)
我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件将N(任何正整数)作为输入参数,通过使用头文件的函数,它给出输出说'x&y'(都是双精度)。
注意:
- 主文件和头文件都是用C++编写的。
- 主文件和头文件都使用特征库,而不是使用数据结构作为数组,向量 。
我必须为他们编写一个python包装器,我有python的工作知识,但从未使用过任何包装器。
任何人都可以参考或给出一些关于使用python wrpper进行此类代码的说明吗?
以下是您的选择:
-
你可以使用 ctypes,我认为这是最干净的解决方案,因为您可以将程序转换为可以由任何其他软件调用的共享库,而不仅仅是 Python。但是,您必须自己为程序编写一个C接口。
-
你可以使用Python C-Extension,我认为这是最糟糕的解决方案,因为它的级别非常低,容易出现内存泄漏,并且需要花费大量时间来实现一个函数,并且依赖于Python版本。基本上,这很好在C++内启动Python解释器。您可以创建 PyObjects(这是任何 Python 类型的主构建块)并在独立的 C/C++ 中处理它们。
-
您可以使用 SWIG,它通过您定义的接口文件自动创建您必须使用 ctypes 创建的接口。人们说它非常好,但文档没有那么好。
-
你可以使用 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。
- 在C++中手动调整数组大小
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 手动SIMD代码可负担性
- 我可以在我的 cmake 代码中手动使用 CMake 的 cpp 文件依赖项扫描程序吗?
- 用python包装C++代码(手动)
- 无法通过循环运行我的代码,但是手动复制和粘贴有效
- 如何手动编译使用C++的Cython代码
- 线程代码解释器中的手动操作调用(破坏正常流)
- 在已编译的可执行文件的.text部分中增加或指定间隙,以手动添加程序集代码
- 如果我使用Glew,我需要手动处理所有这些代码吗?
- 如何手动设置单选按钮激活(通过代码)
- 代码执行:如何手动创建多维数组