7

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

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

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

saySomething("Hello")

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

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

我已经查看了 ctypes 和各种 wrappin 库,例如 boost:python 或 swig,但我似乎无法理解它们可以在多大程度上帮助我实现我想要的。

4

3 回答 3

5

根据您感兴趣的 Python 版本(2.x 或 3.x),通读 2.x 或 3.x 的扩展嵌入Python 解释器一章。您只对扩展Python 感兴趣,因此第1 节。使用 C 或 C++ 扩展 Python将为您提供完整的解释,以便能够从 Python 脚本调用用 C++ 实现的函数。

当然,有许多库和生成器允许您为 Python 包装 C/C++ API(例如Boost.PythonSWIG),但您的情况听起来很简单,为了学习,IMO 最好熟悉 Python C API。即使您使用这些工具,您也经常不得不深入了解 Python C API,或者至少了解它。

于 2012-11-21T17:55:18.390 回答
4

我最近需要做这件事。Boost.Python 做了我们正在寻找的东西(以及更多),但就个人而言(尽管我很喜欢 Boost),我发现不得不将 Boost 库的一半拖入以获得一个功能有点过头了。SWIG 对我来说也不是一个真正的选择,因为当类结构发生变化时,代码生成总是变得难以维护(不要误会我的意思,这些是出色的解决方案!,只是不是我想要的)。

所以,留给我的唯一一件事就是从第一原则(Python/C API)实现它。Hense,“ECS:Python”诞生了。ECS:Python(Embedded C++ Scripting with Python)是我专门为 C++ 开发人员设计的一个简单的 C++ Python 包装库。它允许您将 C++ 应用程序中的对象公开给嵌入式 Python 解释器以进行交互式脚本,而且它非常轻量级且易于使用。

它的免费(BSD)和开源。如果您对这里感兴趣,请访问:http: //sourceforge.net/projects/ecspython

于 2012-11-27T19:17:25.017 回答
3

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

于 2012-11-21T17:44:01.000 回答