我有一个场景,我在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,但我似乎无法理解他们可以帮助我实现我想要的程度。
答案 0 :(得分:5)
根据您感兴趣的Python版本,2.x或3.x, 阅读2.x或3.x的扩展和嵌入Python解释器章节。您只对扩展 Python感兴趣,因此请选择 1。使用C或C ++扩展Python 将为您提供完整的解释,说明如何实现所需,以便能够从Python脚本调用C ++实现的函数。
当然,有许多库和生成器允许你为Python包装C / C ++ API(例如Boost.Python或SWIG),但你的案例听起来很简单,为了学习的目的熟悉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脚本中获取它们的输出。