获取嵌入式Python运行时以使用当前活动的virtualenv

获取嵌入式Python运行时以使用当前活动的virtualenv,python,virtualenv,Python,Virtualenv,我大量使用virtualenv将我的开发环境与系统范围的Python安装隔离开来。使用virtualenv的典型工作流程包括运行source/path/to/virtualenv/bin/activate来设置Python执行独立运行时所需的环境变量。确保我的Python可执行文件使用当前活动的virtualenv就像将shebang设置为#一样简单/usr/bin/env python source /path/to/virtualenv/bin/activate #!/usr/bin/env

我大量使用virtualenv将我的开发环境与系统范围的Python安装隔离开来。使用virtualenv的典型工作流程包括运行source/path/to/virtualenv/bin/activate来设置Python执行独立运行时所需的环境变量。确保我的Python可执行文件使用当前活动的virtualenv就像将shebang设置为#一样简单/usr/bin/env python

source /path/to/virtualenv/bin/activate #!/usr/bin/env python 不过,最近我一直在编写一些嵌入Python运行时的C代码。我似乎不知道如何让嵌入式运行时使用当前的活动virtualenv。有人有好的例子可以分享吗?

嗯,这种暗示应该是可行的(我把它理解为含糊不清地暗示解释器调用getenv本身),但似乎缺乏足够的上下文来确定,我从来没有机会实际测试它

因为它显然不适合您,所以您真正需要的可能是,您只需要使用从
getenv(“PYTHONHOME”)
获得的字符串副本调用它

当然,如果需要,您还可以修改
sys.path
,以获得
PYTHONPATH
的效果。

看来,只要您的path在预安装的python版本之前有virtualenv目录,它就可以工作。如果没有,请尝试设置Nicholas Knight提到的蟒蛇之家

似乎不是答案,但在其他情况下仍可能有用。

您是否尝试过从Python virtualenv运行
bin/activate\u this.py
?my virtualenv的此文件中的注释如下:

通过使用
execfile(这个文件,dict(\uu文件\uu=这个文件))
您将 激活此VirtualEnvironment

当您必须使用现有的Python解释器而不是 virtualenv
bin/python


如果执行上述代码的等效运行时,您应该可以获得所需的结果。

检查路径和设置Py_SetProgramName对我很有效:

std::向量路径;
std::string pathEnv=getenv(“路径”);
boost::split(路径、路径、boost::是(“;:”)中的任意一个);
for(标准::字符串路径:路径)
{
boost::filesystem::path pythonPath=boost::filesystem::path(path)/“python”;

std::cout您可以检查环境变量VIRTUAL_ENV以获取当前的envs位置。

我发现@dikobraz的答案在mac OSX venvs上对我不起作用,因为即使在设置了
PythonProgName
之后,前缀和
PythonHome
仍然被错误地设置为系统python目录

相反,对我起作用的是:

if (auto venv_path = std::getenv("VIRTUAL_ENV")) {
    setenv("PYTHONHOME", venv_path, true);
}

在运行
Py_Initialize()之前

非常感谢您对一个非常陈旧的问题的回答。您的解决方案看起来很有效,但我还没有时间验证。我有同样的问题,这个答案是正确的。将程序名设置为virtualenv的python解释器的完整路径是解决方案。否则,virtualenv中可用的模块是not找到了,即使它是在shell中激活的。是的,我熟悉激活虚拟环境。问题是让嵌入运行时的C/C++代码识别它正在虚拟环境中运行。解决方案会用C/C++进行演示。当我阅读和回答问题时,这对我来说并不明显。activate_This.py仅在使用(非标准)virtualenv模块创建virtualenv目录时可用,但在使用标准venv模块创建目录时不可用。