我尝试使用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\
的虚拟环境
1条答案
按热度按时间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
文件。PREFIX
和EXEC_PREFIX
的构建时设置也是相关的,Windows上的一些注册表设置也是相关的。硬编码的回退基于CPython源代码树的布局和在源代码 checkout 中工作时的构建输出。pep 587在以后版本中的实现应该会促进这一切!