判断这一点最可靠的方法是判断是否为sys.prefix == sys.base_prefix
.如果它们相等,则您不在虚拟环境中;如果它们不相等,则您处于虚拟环境中.在虚拟环境中,sys.prefix
指向虚拟环境,sys.base_prefix
是创建viralenv的系统Python的前缀.
以上内容适用于Python3 stdlib venv
和最近的virtualenv
(自版本20起).virtualenv
的旧版本使用sys.real_prefix
而不是sys.base_prefix
(sys.real_prefix
在虚拟环境之外不存在),在Python 3.3和早期版本中,sys.base_prefix
从来都不存在.因此,处理所有这些情况的完全可靠的判断可能如下所示:
import sys
def get_base_prefix_compat():
"""Get base/real prefix, or sys.prefix if there is none."""
return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix
def in_virtualenv():
return get_base_prefix_compat() != sys.prefix
如果您只关心受支持的Python版本和最新的virtualenv
,那么可以将get_base_prefix_compat()
替换为sys.base_prefix
.
使用VIRTUAL_ENV
环境变量是不可靠的.它由virtualenv activate
shell脚本设置,但是可以通过直接从virtualenv的bin/
(或Scripts
)目录运行可执行文件来使用virtualenv,而无需激活,在这种情况下,不会设置$VIRTUAL_ENV
.或者,当在shell中激活virtualenv时,可以直接执行非virtualenv-Python二进制文件,在这种情况下,可以在实际上没有在该virtualenv中运行的Python进程中设置$VIRTUAL_ENV
.