将 Python CLI 嵌入到 C++ 程序中

问题描述 投票:0回答:2

我正在开发一个更大的 C++ 代码库,我想向其中添加一个 Python CLI,例如用于测试目的。为此,我想向 python 公开一些 C++ 函数,以便与我的系统进行交互。问题是,我的 C++ 程序在我希望 python shell 处于活动状态的同时运行,这样我就可以向系统发送一些事件并得到答案。我已经去了 google 小屋,但我能找到的只是如何将 C/C++ 代码编译为 python 模块,或者如何从 C/C++ 中调用 python 代码。我还没有找到关于如何在活动系统上使用 python CLI 的解决方案或任何示例。

到目前为止,唯一与我想做的事情类似的是

PyRun_InteractiveLoop
命令。这样,我至少在 C++ 代码运行时运行了 python CLI。我还找到了几个关于如何使 C++ 代码可以作为模块从 python 调用的示例。问题是,我找不到同时获得这两件事的方法。

python c++ command-line-interface python-c-api
2个回答
0
投票

作为已将 Python CLI 添加到 C++ 代码库的人,我建议以下几点:

  • 将 CLI 作为单独的进程运行
    • 这一点我真的怎么强调都不为过。当您最终希望 CLI“停止”时,任何通过线程运行 python 代码的尝试都注定失败
      • CPython 解释器能够停止,因为它在运行时实际上是 JIT 代码,并且它自己对 Ctrl+C 事件执行检查。你不会有这种能力,所以你会被困在Python线程中尝试引发异常,这仍然不能保证它终止,即使它终止,你也可能处于糟糕的状态
    • 您可能会想在同一个进程中运行它们,这样您就可以通过例如 SWIG/pybind/boostpython 等方式使用 python API 包装您的 C++ 代码,并作为奖励共享内存/对象,但您将不可避免地想要一个单独的进程,因为否则您将永远无法保证 CLI“停止”。如果将此 CLI 暴露给客户,情况会加倍。
    • 我是否已经提到过它们应该是单独的进程?基本上可以认为它与 Web 应用程序相同,其中前端是 Python,后端是 C++
  • 使用消息总线在 C++ 系统和 Python CLI 之间进行通信
    • RabbitMQ 或 ZeroMQ 是不错的选择
    • C++ 进程运行一个线程来轮询来自 CPython 代码的消息,而 CPython 代码运行一个线程来轮询来自 UI 的消息(无论是在 C++ 整体应用程序中还是单独的应用程序中)
  • CLI应该用CPython编写; Python 有一个很好的 C 库,用于与 Python 对象交互,尽管它有时缺少您想要的文档。我发现有时阅读 cypthon 解释器的源代码很有帮助

0
投票

-您可以使用 PyRun_SimpleString 函数或加载 Python 脚本来运行 Python 代码。

-包含 C++ 和 Python 所需的头文件。对于 C++,包含或您需要的任何其他标头。对于 Python,请包含 Python.h。

 #include <iostream>
 #include <Python.h>


 int main(int argc, char* argv[]) {
    Py_Initialize();

    // Run a Python command
    PyRun_SimpleString("print('Hello from Python!')");

    Py_Finalize();
    return 0;
 }
© www.soinside.com 2019 - 2024. All rights reserved.