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

w41d8nur  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(149)

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

py_SetProgramName

py_SetPythonHome

另外,当阅读c-python代码时,我可以看到pvenv.cfg._pth文件的使用,但这些解决方案似乎都不起作用。
你知道从API使用虚拟环境的正确方法吗?
编辑
让我们举一个具体的例子。我安装了python

c:\python36

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

c:\my_cpp_app\python_venv\

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

yftpprvb

yftpprvb1#

正如评论中所说,嵌入式python 3.6和用venv创建的虚拟环境似乎不兼容(bugs.python.org/issue22213
我设法使用virtualenv并通过在Py_Initialize之前调用Py_SetPythonHome来使其工作。

查找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文件。
PREFIXEXEC_PREFIX的构建时设置也是相关的,Windows上的一些注册表设置也是相关的。硬编码的回退基于CPython源代码树的布局和在源代码 checkout 中工作时的构建输出。
pep 587在以后版本中的实现应该会促进这一切!

相关问题