是否有可能确定当前脚本是否在virtualenv环境中运行?


当前回答

你可以选择哪个python,看看它是否指向虚拟环境中的那个。

其他回答

这里有很多好的答案,也有一些不太可靠的答案。 以下是概述。

如何不这样做

不要依赖于Python或site-packages文件夹的位置。

如果将这些设置为非标准位置,这并不意味着 你实际上是在一个虚拟的环境中。用户可以拥有多个 Python版本,这些并不总是在你期望的地方。

避免看:

sys.executable sys.prefix pip - v python的

另外,不要检查在这些路径中是否存在venv、.venv或envs。 这将打破具有更独特位置的环境。例如, Pipenv使用哈希值作为其环境的名称。

VIRTUAL_ENV环境变量

virtualenv和venv在激活环境时都会设置环境变量$VIRTUAL_ENV。 参见PEP 405。

您可以在shell脚本中读取该变量,或者使用此Python代码来确定是否设置了该变量。

import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ

# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv = bool(os.getenv("VIRTUAL_ENV"))

问题是,这仅在由activate shell脚本激活环境时才有效。

您可以在不激活环境的情况下启动环境的脚本,因此如果需要考虑这一点,则必须使用不同的方法。

sys.base_prefix

Virtualenv, venv和pyvenv点系统。安装在virtualenv内部的Python的前缀。

同时,将sys. xml文件的原始值修改为sys. xml文件的原始值。Prefix也可用作sys.base_prefix。

我们可以用它来检测我们是否在虚拟环境中。

import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix

回退:sys.real_prefix

现在注意了,virtualenv在版本20之前没有设置sys。Base_prefix但是它设置了sys。real_prefix代替。

所以为了安全起见,请根据hroncok的回答进行检查:

import sys

real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)

running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix

水蟒

如果您正在使用Anaconda虚拟环境,请检查 维多利亚·斯图尔特的回答。

在windows操作系统中,你会看到这样的东西:

C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>

括号表示您实际处于名为“virtualEnvName”的虚拟环境中。

试着使用pip -V(注意大写V)

如果您正在运行虚拟环境。它会显示通往环境的路径。的位置。

检查你的Virtualenv内部:

import os

if os.getenv('VIRTUAL_ENV'):
    print('Using Virtualenv')
else:
    print('Not using Virtualenv')

您还可以获得有关您的环境的更多数据:

import sys
import os

print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')

如果你正在使用水蟒,这里是解决方案。该命令列出所有可发现的环境

conda info --envs