是否有可能确定当前脚本是否在virtualenv环境中运行?
当前回答
最可靠的检查方法是检查sys。Prefix == sys.base_prefix。如果它们相等,则不是在虚拟环境中;如果它们不相等,你就是。在虚拟环境中,sys。Prefix指向虚拟环境,sys. Prefix指向虚拟环境。base_prefix是创建virtualenv的系统Python的前缀。
上面的代码总是适用于python3 stdlib venv和最近的virtualenv(自版本20起)。旧版本的virtualenv使用sys. exe。而不是sys. Real_prefix。Base_prefix(和sys。real_prefix在虚拟环境之外不存在),在Python 3.3和更早的sys. real_prefix中。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,你可以用sys.base_prefix替换get_base_prefix_compat()。
使用VIRTUAL_ENV环境变量不可靠。它是由virtualenv激活shell脚本设置的,但是virtualenv可以在不激活的情况下使用,直接从virtualenv的bin/(或Scripts)目录运行可执行文件,在这种情况下,$VIRTUAL_ENV将不会被设置。或者一个非virtualenv的Python二进制文件可以在shell中激活virtualenv时直接执行,在这种情况下,$VIRTUAL_ENV可以在一个Python进程中设置,而该进程实际上并没有在该virtualenv中运行。
其他回答
根据http://www.python.org/dev/peps/pep-0405/#specification上的virtualenv pep,你可以使用sys。前缀代替os.environ['VIRTUAL_ENV']。
sys。Real_prefix在我的virtualenv中不存在,sys.base_prefix也是如此。
检查你的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")}')
最可靠的检查方法是检查sys。Prefix == sys.base_prefix。如果它们相等,则不是在虚拟环境中;如果它们不相等,你就是。在虚拟环境中,sys。Prefix指向虚拟环境,sys. Prefix指向虚拟环境。base_prefix是创建virtualenv的系统Python的前缀。
上面的代码总是适用于python3 stdlib venv和最近的virtualenv(自版本20起)。旧版本的virtualenv使用sys. exe。而不是sys. Real_prefix。Base_prefix(和sys。real_prefix在虚拟环境之外不存在),在Python 3.3和更早的sys. real_prefix中。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,你可以用sys.base_prefix替换get_base_prefix_compat()。
使用VIRTUAL_ENV环境变量不可靠。它是由virtualenv激活shell脚本设置的,但是virtualenv可以在不激活的情况下使用,直接从virtualenv的bin/(或Scripts)目录运行可执行文件,在这种情况下,$VIRTUAL_ENV将不会被设置。或者一个非virtualenv的Python二进制文件可以在shell中激活virtualenv时直接执行,在这种情况下,$VIRTUAL_ENV可以在一个Python进程中设置,而该进程实际上并没有在该virtualenv中运行。
这里已经发布了很多很棒的方法,但只需要再添加一个:
import site
site.getsitepackages()
告诉您PIP安装包的位置。
(编辑)我是这样发现的,你怎么看?(它还返回venv的基本路径,甚至适用于不检查env变量的readthedocs):
import os
import sys
from distutils.sysconfig import get_config_vars
def get_venv_basedir():
"""Returns the base directory of the virtualenv, useful to read configuration and plugins"""
exec_prefix = get_config_vars()['exec_prefix']
if hasattr(sys, 'real_prefix') is False or exec_prefix.startswith(sys.real_prefix):
raise EnvironmentError('You must be in a virtual environment')
return os.path.abspath(get_config_vars()['exec_prefix'] + '/../')
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?