在 C++ 应用程序中嵌入 python 环境

Posted

技术标签:

【中文标题】在 C++ 应用程序中嵌入 python 环境【英文标题】:embed python environment in c++ application 【发布时间】:2019-06-26 17:26:32 【问题描述】:

我尝试使用 c-python api 将 python 3.6 嵌入到 c++ 应用程序中。 但是,我不想使用系统安装,而是使用虚拟环境。 我没有找到任何关于这样做的文档。 一些相关文档提到

py_SetProgramName

py_SetPythonHome

此外,在阅读 c-python 代码时,我可以看到 pvenv.cfg._pth 文件的使用,但这些解决方案似乎都不起作用。

知道从 c api 使用虚拟环境的正确方法是什么吗?

编辑

让我们举一个具体的例子。我已经安装了python

c:\python36

对于我的 c++ 应用程序,我使用命令 python -m venv c:\my_cpp_app\python_venv\ in 创建了一个虚拟环境:

c:\my_cpp_app\python_venv\

使用 c-python api 我想让我的 cpp 应用程序使用位于 python_venv 的虚拟环境,而不是 c:\python36\

【问题讨论】:

我假设“另一个虚拟环境”是指一些特殊的 PYTHONHOME/PYTHONPATH (docs.python.org/3/using/cmdline.html#envvar-PYTHONHOME) 而不是完全不同的 Python 版本(只能在编译时选择),在在这种情况下,您必须在调用生成的 exe 之前设置它们。或者使用Py_SetPath (docs.python.org/3/c-api/init.html#c.Py_SetPath) / Py_SetPythonHome (docs.python.org/3/c-api/init.html#c.Py_SetPythonHome) 在exe中设置它。目前尚不清楚您想做什么以及您的确切问题是什么。 感谢答案,我更新了问题以添加示例。希望它会更清楚......我也在 bug python bug tracker bugs.python.org/issue22213 中发现了这个问题,我认为这是同一个问题。 你可以试试docs.python.org/3/library/venv.html 鉴于错误报告中的描述,这是一个尚未解决的问题(并且仅针对 linux 提出了解决方法)。我不知道你用嵌入的 Python 做什么,但可能只是在解释器初始化后设置正确的 python-path 就足够了。 使用 virtualenv 而不是 venv 创建环境并使用 Py_SetPythome 工作正常。看起来 pep 提案是在 3.8 中实施的。谢谢你的帮助 【参考方案1】:

如 cmets 所述,嵌入式 python 3.6 和使用 venv 创建的虚拟环境似乎不兼容 (bugs.python.org/issue22213)

我设法改用virtualenv 并在Py_Initialize 之前调用Py_SetPythonHome 使其工作。 查看python startup sequence的更多详情

定位 Python 和标准库

Python 的位置 二进制和标准库受几个元素的影响。这 用于执行计算的算法没有记录在任何地方 除了在源代码中。连那个描述都是 不完整,因为它未能针对虚拟环境进行更新 在 Python 3.3 中添加的支持(详见 PEP 405)。

这些计算 受以下函数调用的影响(在调用之前进行 Py_Initialize()) 和环境变量:

Py_SetPythonHome() Py_SetProgramName() PYTHONHOME

文件系统也被检查 pyvenv.cfg 文件(请参阅 PEP 405),或者,如果失败,lib/os.py(Windows) 或lib/python$VERSION/os.py 文件。

PREFIX 的构建时间设置 和EXEC_PREFIX 也是相关的,一些注册表设置也相关 视窗。硬编码后备基于 在源代码中工作时的 CPython 源代码树和构建输出 结帐。

pep 587 在后续版本中的实现应该会促进这一切!

【讨论】:

以上是关于在 C++ 应用程序中嵌入 python 环境的主要内容,如果未能解决你的问题,请参考以下文章

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

在 python 中嵌入 c++ 代码会使你的 python 应用程序更快吗? [关闭]

在 C++ 中嵌入 python

如何中断嵌入在 C++ 应用程序中的 python 解释器

在 C++ Qt 应用程序中嵌入 Python/Numpy/Matplotlib?

在 Cygwin/GCC C++ 程序中嵌入 Windows Python