【问题标题】:Does compiling and linking Python in a C++ program mean that target users won't need python installed?在 C++ 程序中编译和链接 Python 是否意味着目标用户不需要安装 python?
【发布时间】:2020-05-15 17:13:51
【问题描述】:

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

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

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

另外,还有什么:

"类 Unix 系统下的(...)"

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

提前致谢。

【问题讨论】:

  • 在任何重要程序中嵌入解释器所带来的问题和复杂性很容易被低估。如果您这样做的唯一原因是为了简化 IPC,您可能需要查找如何从 C 中调用 Python 函数的示例。有很多完美的 IPC 解决方案,它们的效率并不会降低很多并且更容易使用比起那个来说。去过那里,希望我没有。

标签: python c++ python-embedding


【解决方案1】:

在所有平台上都可以嵌入 Python 解释器。然而,它只是是解释器。嵌入任何库都将变得更加困难,甚至是不可能的。

但是由于您似乎已经部署了 Python 库,因此您可以从嵌入式解释器中很好地使用它们。然后你可以在没有 IPC 的情况下桥接 C++ 和 Python,因为它们都在同一个进程中运行。

pybind11 非常适合嵌入和生成 C++ Python 接口。

根据使用的库,一种可能的替代方法可能是导出模型并使用 C++ 库来加载和使用它(例如 Tensorflow -> ONNX -> ONNX runtime)。

【讨论】:

  • 感谢 ONNX 信息,可能只导入模型是最好的方法
【解决方案2】:

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

据我尝试,此过程适用于 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 方模块可能会产生一些许可后果。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2020-07-29
    • 2010-10-17
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多