在 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 应用程序更快吗? [关闭]