我有一个主文件(main.cpp)和一个头文件(nodes.hpp)。主文件采用N(任何正整数)作为输入参数,并使用头文件的函数给出输出'x& y'(双倍)。
注意:
我必须为它们编写一个python包装器,我有python的工作知识,但从未使用过任何包装器。
任何人都可以参考或给出一些关于使用python wrpper这些代码的注意事项吗?
答案 0 :(得分:6)
使用Boost.Python。这是我之前在SO Docs上的教程。
使用Boost.Python
当您必须在Python项目中使用C ++库时,事情很简单。只是你可以使用Boost。
首先,这里是您需要的组件列表:
让我们从一个小的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)
要运行项目,请按照以下说明操作:
cmake -DCMAKE_BUILD_TYPE=Release ..
make
python MyProject.py
。现在,您必须看到C ++项目中的方法返回的字符串。答案 1 :(得分:3)
以下是您的选择:
您可以使用ctypes,我认为这是最干净的解决方案,因为您将程序转换为可由任何其他软件调用的共享库,而不仅仅是Python。但是,您必须自己为程序编写C接口。
您可以使用Python C-Extension,我认为这是最糟糕的解决方案,因为它的级别非常低,容易出现内存泄漏,并且需要花费大量时间来实现一个功能,并且是依赖于Python版本的。基本上,在C ++中启动Python解释器是很好的。您可以创建PyObjects(这是任何Python类型的主要构建块)并使用C / C ++来处理它们。
您可以使用SWIG,它会自动创建您必须通过您定义的接口文件使用ctypes创建的接口。人们说它非常好,但文档不太好。
你可以使用Boost.Python,这很好,但它有一个非常丑陋的构建系统和bjam。如果你可以设法绕过它,那么它比ctypes更好。我是一个很好的助推器,但bjam是我不能使用它的原因。
我所做的通常是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)