python - 在 C++ 程序中编译和链接 Python 是否意味着目标用户不需要安装 python?
问题描述
我有一个使用 Python 机器学习的 C++ 应用程序,我目前的方法是使用 pyInstaller 使单个文件可执行,然后从 C++ 运行它。这有明显的缺点,尤其是应用程序间的通信。目前我正在使用一个中间 JSON 文件来相互交谈,但这对于我未来的需求来说是非常不理想的。这样做的美妙之处在于,它可以在所有主要平台上运行而没有太多麻烦。
第 1.6 节。来自Python 的手册阅读“类 Unix 系统下的编译和链接”
这是否意味着 Python 解释器将在我的应用程序二进制文件中,并且目标系统不需要安装 Python,因为程序将始终使用嵌入式解释器?如果是这样,python库是什么?我可以嵌入整个 conda 环境吗?
另外,还有什么:
“(...)在类 Unix 系统下”
这是否意味着这种方法不是多平台的?
提前致谢。
解决方案
这意味着 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 方模块可能会产生一些许可后果。
推荐阅读
- java - snapshot.getValue(User.class) 返回 null
- excel - Excel - 如果条件为真,则从其他工作表复制
- javascript - Dynamics 365 FetchXml 返回不同的结果
- javascript - 排队事件直到准备好
- excel - 如何在 CSV 源文件中直接将 Microsoft Excel 中的公式格式化为百分比格式
- docker - Docker 容器中的联合挂载
- php - 我该如何解决这个数字加倍和减半的问题?
- groff - Groff Eqn - 如何做更高的根(立方根等)
- c# - Azure Blob 存储授权
- google-apps-script - 例外:数据验证规则的项目数超过了 500 的限制。请改用“范围列表”条件