如何分发调用Python C++应用程序?

How to distribute C++ application which calls Python?

本文关键字:C++ 应用程序 Python 调用      更新时间:2023-10-16

我知道有一些方法可以从C++调用Python,比如Python/C API或Boost.Python。 我的问题是,如何分发应用程序? 例如,用户是否仍然需要在他们的机器上安装 Python 和 Python 包?

我的用户案例是:我想从我的C++代码中使用一些 Python 代码。主要应用程序是用C++编写的。 然后,我将部署我的应用程序。目标是使应用程序自包含,用户根本不需要安装 Python 和 Python 包。

可能的步骤可能是: 1、通过 Python/C API 或 boost 从C++调用 Python。来自源代码的 Python。 2、将Python/C库与应用结合在一起。

我希望经过这两个步骤,我的应用程序将成为一个独立的软件。 用户可以将应用程序文件夹复制到任何其他未安装Python的计算机。

请注意,由于许可证问题,我无法使用PyInstaller。在尝试使用"Nuitka"使Python部分自包含时,我也遇到了一些问题。 所以我现在尝试直接从C++调用 Python。 我知道它将在我的开发人员计算机上运行。但需要确认的是,此解决方案还可以使应用程序自包含,并且不会要求用户安装 Python。

更新:现在我觉得如果我使用 Python/C 从 C++ 调用 python,我需要做一些事情来使我的应用程序自包含: 1,我需要将所有需要的运行时与我的应用程序一起携带(当然C++运行时和python_version.dll) 2,我需要在我的应用程序中部署一个 Python 解释器。 只需从 Python 安装中复制 Python 文件夹并删除一些不需要的文件(如头文件、lib 文件) 3、使用Py_SetPythonHome函数指向应用内复制的Python解释器。

我会说你走在正确的轨道上。基本上,你应该获得一个Python(共享或静态)库,用它编译你的程序,当然还有将你拥有的Python依赖项与你的程序捆绑在一起。我读过的最好的文档可以在这里找到:https://docs.python.org/3.8/extending/embedding.html#embedding-python-in-another-application。粗略地说,该过程是:

  1. 从 python.org 获取一个 Python 库并使用./configure --enable-shared进行编译(我相信省略--enable-shared只会产生python二进制文件)。
  2. 编译你的程序。让它引用Include下的标头并链接库。请注意,您可以获取所需的编译器和链接器标志,如此处所述。
  3. 从应用程序内部调用 Python 代码,例如 C API 中的PyRun_SimpleString()或其他函数。请注意,如果您从中可以使用任何功能,您可能还依赖于 Python 标准库(在发行版中的Lib下)。

如果你静态地链接到Python,那么在这一点上你已经完成了,除了捆绑你依赖的任何Python代码,我不确定这与你的情况是否相关。

我遇到了同样的问题,我有一个由C++python(嵌入式)组成的项目,并且存在部署/分发的问题.
经过研究,我得到了一个不完美的解决方案(意味着在其他系统中运行您的应用程序会很有帮助)

  • 在发布模式下更改Visual Studio并进行编译(您的工作目录中有一个文件夹)
  • 安装 pyinstaller
  • (pip install pyinstaller)
  • 然后导航到 Pyinstaller
  • 文件夹并命令:-Pyinstaller.exe"您的script_file_path.py" -它将创建一个dist文件夹
  • 在 EXE 所在的工作文件夹中复制该文件夹。

记得。 dist 文件夹和由相同版本的 Python 编译的 C/Python 代码。

现在好了。 它会起作用。