如何分发调用Python C++应用程序?
How to distribute C++ application which calls Python?
我知道有一些方法可以从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。粗略地说,该过程是:
- 从 python.org 获取一个 Python 库并使用
./configure --enable-shared
进行编译(我相信省略--enable-shared
只会产生python
二进制文件)。 - 编译你的程序。让它引用
Include
下的标头并链接库。请注意,您可以获取所需的编译器和链接器标志,如此处所述。 - 从应用程序内部调用 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 代码。
现在好了。 它会起作用。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?