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

embed python environment in c++ application

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

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

py_SetProgramName

py_SetPythonHome

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

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

编辑

让我们举一个具体的例子。我安装了蟒蛇

c:python36

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

c:my_cpp_apppython_venv

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

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

我设法使用它virtualenv代替,并通过调用Py_SetPythonHome先前的Py_Initialize. 查看有关 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 应该可以促进这一切!