将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)

Posted

技术标签:

【中文标题】将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)【英文标题】:Embed Python in C++ app regadless if python is installed or not (on windows)将 Python 嵌入到 C++ 应用程序中,无论是否安装了 Python(在 Windows 上) 【发布时间】:2016-02-26 04:29:09 【问题描述】:

我有一个运行用户脚本的应用程序,使用 python 站点上的示例,我可以嵌入 python 3.5

问题不在于嵌入代码,而在于用户是否/或安装了哪个版本的 Python。

#include <Python.h>

int
main(int argc, char *argv[])

  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;

这假设用户安装了 Python 3.5,如果他们安装了其他东西,嵌入的脚本可能无法工作。

或者更糟糕的是,应用程序本身无法加载。

如果他们根本没有安装 Python,那么对 Py_Initialize(); 的调用只会使应用程序崩溃。

所以我有几个问题,我如何在我的应用程序中包含 Python,无论他们是否安装了 python?

或者,我如何测试他们安装的 Python 版本,所以如果他们没有安装或没有正确安装,我不会尝试调用 Py_Initialize();一个

【问题讨论】:

【参考方案1】:

...如何测试他们安装的 Python 版本...

见Py_GetVersion。

...如何在我的应用程序中包含 Python,无论他们是否安装了 Python?

对于完整的嵌入,有一个指南:Statically Embedding Python on Windows。通常,您只需将 Python DLL + 标准库文件夹复制到您的应用程序文件夹中并在初始化之前更改搜索路径(请参阅Py_SetPath 和Py_SetPythonHome)。

【讨论】:

对于 Python 3.5,有一个 embeddable package 包含您需要的一切——DLL 和扩展模块(包括 vcruntime140.dll),预编译 (.pyc) 标准的压缩副本库,以及一个定义 applocal = true 的 pyvenv.cfg 文件。 它依赖于通用 CRT 更新,kb2999226。此外,3.5 放弃了对 Windows XP 的支持,这可能是 OP 应用程序的问题。

以上是关于将 Python 嵌入到 C++ 应用程序中,无论是不是安装了 Python(在 Windows 上)的主要内容,如果未能解决你的问题,请参考以下文章

试图将 python 嵌入到 Visual Studio 2010 C++ 文件中,并以代码 1 退出

是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?

在 Python GUI 中嵌入 C++ 程序

将 python + numpy 代码嵌入到 C++ dll 回调中

将 Java 嵌入到 C++ 应用程序中?

将 Java 嵌入到 C++ 应用程序中?