首页 > 解决方案 > 在 C++ 程序中编译和链接 Python 是否意味着目标用户不需要安装 python?

问题描述

我有一个使用 Python 机器学习的 C++ 应用程序,我目前的方法是使用 pyInstaller 使单个文件可执行,然后从 C++ 运行它。这有明显的缺点,尤其是应用程序间的通信。目前我正在使用一个中间 JSON 文件来相互交谈,但这对于我未来的需求来说是非常不理想的。这样做的美妙之处在于,它可以在所有主要平台上运行而没有太多麻烦。

第 1.6 节。来自Python 的手册阅读“类 Unix 系统下的编译和链接”

这是否意味着 Python 解释器将在我的应用程序二进制文件中,并且目标系统不需要安装 Python,因为程序将始终使用嵌入式解释器?如果是这样,python库是什么?我可以嵌入整个 conda 环境吗?

另外,还有什么:

“(...)在类 Unix 系统下”

这是否意味着这种方法不是多平台的?

提前致谢。

标签: pythonc++python-embedding

解决方案


这意味着 cpython(Python 解释器)将在您的应用程序中。您将能够直接从 C++ 代码运行 Python 代码并观察和操作虚拟机状态(好的入口点 C API 参考在这里)。您的应用程序可能有一些额外的动态库依赖项(哪些依赖于嵌入式 Python 的编译选项)。解释器也不是完全独立的,它依赖于.py通常随 Python 发行版(作为标准库)附带的一些外部模块。如果您计划导入需要标准库的外部模块,则必须将其与您的应用程序一起提供。也有一些方法可以将模块构建为二进制文件(冻结),但您可能会遇到依赖文件系统的模块的问题。

据我尝试,此过程适用于 UNIX 系统和 Windows(最简单的方法是链接 DLL,然后将其与应用程序一起提供)。在 Windows 上,您还需要确保使用与编译 DLL 相同的编译器进行编译(或者从源代码编译 Python DLL)。以下是有关在 Windows 上嵌入的其他信息:https ://docs.python.org/3/faq/windows.html#how-can-i-embed-python-into-a-windows-application

请注意,在您的应用程序中嵌入 Python 和提供第 3 方模块可能会产生一些许可后果。


推荐阅读