是否可以确定当前脚本是否在Virtualenv环境中运行?

推荐答案

判断这一点最可靠的方法是判断是否为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.

Python相关问答推荐

如何合并具有相同元素的 torch 矩阵的行?

jsonschema日期格式

使用SQLAlchemy从多线程Python应用程序在postgr中插入多行的最佳方法是什么?'

删除Dataframe中的第一个空白行并重新索引列

普洛特利express 发布的人口普查数据失败

函数()参数';代码';必须是代码而不是字符串

如何在Polars中将列表中的新列添加到现有的数据帧中?

Pandas:使列中的列表大小与另一列中的列表大小相同

大Pandas 中的群体交叉融合

将时间序列附加到数据帧

生产者/消费者-Queue.get by list

Wagail:当通过外键访问索引页时,如何过滤索引页的子项

逐个像素图像处理的性能问题(枕头)

更改Python中的数据格式

用考克斯回归的生存分析系列的真值是模棱两可的.

元组列表:如果第一个元组元素匹配,则合并两个数据帧列

如何分解在某些行中为空,但在其他行中填充的pandas框架

将MultiIndex列的级别转换为具有值的列(取消堆叠列)

如何在Django中使用使用数学过滤器的If Else条件?

棋类游戏的极大极小函数