如何将 Python 控制台添加到 C/C++ 程序

Posted

技术标签:

【中文标题】如何将 Python 控制台添加到 C/C++ 程序【英文标题】:How to add a Python console to a C/C++ program 【发布时间】:2018-11-18 14:06:04 【问题描述】:

我正在为以下任务寻找一些指示: 我想将 Python 控制台添加到现有的 C/C++ 程序中。一个重要的要求是用户应该能够通过解释器访问我们的软件。应该可以运行整个脚本,也可以在交互模式下使用 Python 解释器。我们已经有一个 Python 模块,用户可以通过它使用套接字访问我们的软件,只是没有集成到我们的软件中。

如果不嵌入和/或扩展 Python 解释器,这是否可行?最好用户能够使用已经安装的任何 python 解释器。我需要 Python 解释器处于交互模式,然后在两个进程之间传输数据。 code.InteractiveInterpreter 或 code.InteractiveConsole (https://docs.python.org/3/library/code.html) 是要走的路吗?

编辑:我不是在寻找第 3 方库/工具。我知道我可以扩展解释器以获得结果。

无论哪种方式(扩展与否),我都必须在进程之间传输数据。哪种进程间通信适合这种任务?

【问题讨论】:

它太宽泛了。 Python 解释器允许使用任何操作系统对象在进程之间进行通信,因此这两个进程无论如何都不应该相关。从另一个角度来看,您可以使用 boost.Python 或仅使用本机 Python API 在 C++ 中创建一个进程,该进程将调用 python 脚本或任何其他内部事物。此外,您可以获取 Python 控制台的源代码,并在其中添加您想要添加的任何内容以进行任何类型的通信。 进程间通信特定于操作系统。如果你想要一个漂亮而强大的多语言抽象,我建议使用 zmq.inproc 套接字。 @Arkady:感谢您的评论。我应该补充一点,我不想使用 3rd 方库——如果不是绝对必要的话。无论如何,我的问题更多是关于“交互式 python 解释器”,其次是关于我们的软件和解释器之间的通信。 【参考方案1】:

如果我正确理解您的问题,使用 pybind11 并嵌入解释器可以使 Python 控制台的实现变得简单。来自docs的Hello world示例:

#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;

int main() 
    py::scoped_interpreter guard; // start the interpreter and keep it alive

    py::print("Hello, World!"); // use the Python API

类型可以在 Python 和 C++ 对象之间转换,并且方便地,该库提供了从常见标准库类型的自动转换,例如std::vector -> list、std::map -> dict 和 python 对象都可以转换。

【讨论】:

pybind11 似乎类似于“Boost.Python”,一个帮助您嵌入/扩展 python 解释器的库。我的问题是我真的需要嵌入和扩展 python 解释器吗?最好用户能够使用已经安装的任何 python 解释器。 您将针对已安装在系统中的 Python 解释器,无需单独安装。只需在您的 cmake 文件中找到_package(PythonLibs)。正如其他人所提到的,IPC 与例如zmq 是另一种可能性。如果你坚持使用 msgpack 之类的东西进行数据交换,那么类型转换也应该非常简单。 这仍然适用于嵌入式解决方案,虽然对我有用,但我正在寻找非嵌入式解决方案。

以上是关于如何将 Python 控制台添加到 C/C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将协程添加到正在运行的 asyncio 循环中?

将文本和行添加到文件的开头(Python)

带有 GCC 的 C/C++:将资源文件静态添加到可执行文件/库

如何使用 C 或 C++ 将选项添加到 Windows 资源管理器上下文菜单?

如何在 Unix 上包含 «pty.h» 头文件/将 «pty.h» 添加到标准库 C / C++

C/C++还能混合编程?这让我事半功倍