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

时间:2017-04-13 08:26:02

标签: python c++ wrapper

我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件采用N(任何正整数)作为输入参数,并使用头文件的函数给出输出'x& y'(双倍)。

注意:

  1. 主文件和头文件都是用C ++编写的。
  2. 主文件和头文件,而不是使用数据结构作为数组,向量,使用特征库。
  3. 我必须为它们编写一个python包装器,我有python的工作知识,但从未使用过任何包装器。

    任何人都可以参考或给出一些关于使用python wrpper这些代码的注意事项吗?

5 个答案:

答案 0 :(得分:6)

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

使用Boost.Python

当您必须在Python项目中使用C ++库时,事情很简单。只是你可以使用Boost。

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

  • 一个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 ++项目中的方法返回的字符串。

答案 1 :(得分:3)

以下是您的选择:

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

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

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

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

  5. 我所做的通常是ctypes。我相信它,因为它强调single-reponsibility principle。该库有一个与接口(C接口)分离的作业,该接口也与使用该接口的Python脚本分开,并且公开了简单的功能"给用户。

答案 2 :(得分:2)

C ++包装器生成的另一个工具是CLIF。在2017年发布,Google最近将这一切用于大多数事情。我们不再允许在内部为Python编写新的SWIG包装器。

它建立在Clang之上用于C ++解析,并且需要相对惯用的现代C ++ API使用(不出所料地遵循Google's Style Guide),而不是任何允许您通过SWIG进行自我射击的尝试"支持一切不良"方法

答案 3 :(得分:1)

尝试使用官方文档:

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

此链接将为您提供如何包含cpp模块并在python解释器中使用它的简单示例,或者如果可以尝试使用Cython:http://cython.org/

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

答案 4 :(得分:0)

您可以使用Boost.Python

或使用Python native interface

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