我使用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\
创建了一个虚拟环境:
c:\my_cpp_app\python_venv\
使用c-python api,我想使我的cpp应用程序使用位于python_venv
中的虚拟环境,而不是c:\python36\
答案 0 :(得分:1)
如评论中所述,嵌入式python 3.6和使用venv创建的虚拟环境似乎不兼容(bugs.python.org/issue22213)
我设法改用virtualenv
并通过在Py_SetPythonHome
之前调用Py_Initialize
使其起作用。
在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应该会很方便!