是否有可能确定当前脚本是否在virtualenv环境中运行?
当前回答
一个潜在的解决方案是:
os.access(sys.executable, os.W_OK)
在我的例子中,我真的只是想检测我是否可以用pip原样安装项目。虽然这可能不是所有情况下的正确解决方案,但请考虑简单地检查您是否具有Python可执行文件位置的写权限。
注意:这适用于所有版本的Python,但如果你使用sudo运行系统Python,也会返回True。下面是一个潜在的用例:
import os, sys
can_install_pip_packages = os.access(sys.executable, os.W_OK)
if can_install_pip_packages:
import pip
pip.main(['install', 'mypackage'])
其他回答
试着使用pip -V(注意大写V)
如果您正在运行虚拟环境。它会显示通往环境的路径。的位置。
它不是万无一失的,但是对于UNIX环境的简单测试,比如
if run("which python3").find("venv") == -1:
# something when not executed from venv
对我来说很好。这比测试现有的某些属性要简单得多,无论如何,您应该将venv目录命名为venv。
检查你的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")}')
这里有很多好的答案,也有一些不太可靠的答案。 以下是概述。
如何不这样做
不要依赖于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虚拟环境,请检查 维多利亚·斯图尔特的回答。
检查$VIRTUAL_ENV环境变量。
在活动的虚拟环境中,$VIRTUAL_ENV环境变量包含虚拟环境的目录。
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
一旦执行deactivate / leave虚拟环境,$VIRTUAL_ENV变量将被清除/空。Python将引发一个KeyError,因为环境变量未设置。
>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'
当然,这些相同的环境变量检查也可以在Python脚本之外的shell中完成。
推荐文章
- 如何删除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中创建一个鼻涕虫?