通过Python脚本调用C ++函数

时间:2012-11-21 17:10:14

标签: c++ python qt boost-python wrapping

我有一个场景,我在C ++类中有一些函数,我希望能够使用python脚本调用它们。假设我有一个功能

void greet(_msg);
    std::cout >> _msg >> std::endl;

我希望能够通过自定义Python调用来调用它并将参数传递给它,例如使用

saySomething("Hello")

作为.py文件,我希望它调用greet函数并传递“Hello”作为参数。

我知道这是一个经过深入讨论的主题,我已经分享了在C ++中嵌入python的研究,我已经设法使用标准的Python / C API从python脚本中读取值并运行从C ++开始在Python中运行并将参数传递给它,但我似乎无法理解如何实现这一特定结果。

我已经看过ctypes和各种包装库,例如boost:python或swig,但我似乎无法理解他们可以帮助我实现我想要的程度。

3 个答案:

答案 0 :(得分:5)

根据您感兴趣的Python版本,2.x或3.x, 阅读2.x3.x扩展和嵌入Python解释器章节。您只对扩展 Python感兴趣,因此请选择 1。使用C或C ++扩展Python 将为您提供完整的解释,说明如何实现所需,以便能够从Python脚本调用C ++实现的函数。

当然,有许多库和生成器允许你为Python包装C / C ++ API(例如Boost.PythonSWIG),但你的案例听起来很简单,为了学习的目的熟悉Python C API是最好的IMO。即使你使用这些工具,你也经常需要开始使用Python C API,或者至少要理解它。

答案 1 :(得分:4)

我最近需要做这件事。 Boost.Python做了我们正在寻找的(以及更多),但我个人(尽管我喜欢Boost)我觉得有必要拖延Boost库中的一半以获得一个功能。 SWIG对我来说也不是一个真正的选择,因为在类结构发生变化时代码生成总是变得很难维护(不要误解我这些是BRILLIANT解决方案!,而不是我想要的)。

因此,我唯一要做的就是从第一原则(Python / C API)实现它。 Hense,“ECS:Python”诞生了。 ECS:Python(嵌入式C ++脚本与Python)是一个简单的C ++ Python包装程序库,我专门为C ++开发人员设计。它允许您将对象从C ++应用程序公开到嵌入式Python解释器以进行交互式脚本编写,并且它非常轻巧且易于使用。

它的免费(BSD)和开源。如果您对此感兴趣,那就是: http://sourceforge.net/projects/ecspython

答案 2 :(得分:3)

您可以使用weave.inline()函数(它是scipy包的一部分)来编译和执行C / C ++文件,并从您的python脚本中获取它们的输出。