是否可以确定当前脚本是否在virtualenv环境中运行?
答案 0 :(得分:194)
AFAIK检查这一点的最可靠方法(以及在virtualenv和pip中内部使用的方式)是检查是否存在sys.real_prefix
:
import sys
if hasattr(sys, 'real_prefix'):
#...
在virtualenv中,sys.prefix
指向virtualenv目录,sys.real_prefix
指向系统Python的“真实”前缀(通常为/usr
或/usr/local
或某些这样)。
在virtualenv之外,sys.real_prefix
不应该存在。
使用VIRTUAL_ENV
环境变量不可靠。它由virtualenv activate
shell脚本设置,但是通过直接运行virtualenv的bin/
(或Scripts
)目录中的可执行文件,可以在不激活的情况下使用virtualenv,在这种情况下{{ 1}}将不会被设置。
答案 1 :(得分:64)
尝试使用pip -V
(注意大写字母V)
如果您正在运行虚拟环境。它将显示环境位置的路径。
答案 2 :(得分:45)
这是对Carl Meyer所接受答案的改进。它适用于Python 3和2的virtualenv以及Python 3中的venv模块:
import sys
def is_venv():
return (hasattr(sys, 'real_prefix') or
(hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
对sys.real_prefix
的检查涵盖了virtualenv,非空sys.base_prefix
与sys.prefix
的平等涵盖了venv。
考虑一个使用如下函数的脚本:
if is_venv():
print('inside virtualenv or venv')
else:
print('outside virtualenv or venv')
以下调用:
$ python2 test.py
outside virtualenv or venv
$ python3 test.py
outside virtualenv or venv
$ python2 -m virtualenv virtualenv2
...
$ . virtualenv2/bin/activate
(virtualenv2) $ python test.py
inside virtualenv or venv
(virtualenv2) $ deactivate
$ python3 -m virtualenv virtualenv3
...
$ . virtualenv3/bin/activate
(virtualenv3) $ python test.py
inside virtualenv or venv
(virtualenv3) $ deactivate
$ python3 -m venv venv3
$ . venv3/bin/activate
(venv3) $ python test.py
inside virtualenv or venv
(venv3) $ deactivate
答案 3 :(得分:25)
使用$ VIRTUAL_ENV变量确实会检查我们是否在虚拟环境中,但问题可能在于当我们离开virtualenv时无法清除此变量的停用功能。
答案 4 :(得分:19)
根据http://www.python.org/dev/peps/pep-0405/#specification的virtualenv pep,您可以使用sys.prefix而不是os.environ ['VIRTUAL_ENV']。
我的virtualenv中不存在sys.real_prefix,与sys.base_prefix相同。
答案 5 :(得分:5)
这里有多个好的答案,而有些则不太可靠。 这是概述。
请勿依赖Python或site-packages
文件夹的位置。
如果将这些设置为非标准位置,则不是 您实际上是在虚拟环境中。用户可以拥有多个 已安装Python版本,但这些版本并不总是在您期望的位置。
避免看:
sys.executable
sys.prefix
pip -V
which 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.real_prefix
和sys.base_prefix
Virtualenv如您所愿,将sys.prefix
指向安装在virtualenv内部的Python。
同时,sys.prefix
的原始值也可以作为sys
的新属性:sys.real_prefix
使用。
这就是我们用来检测我们是否在virtualenv中的方法。
import sys
running_in_virtualenv = hasattr(sys, "real_prefix")
但是有一个问题:venv
和pyvenv
的做法与virtualenv
不同-它们没有
设置real_prefix
。而是将base_prefix
设置为与sys.prefix
不同的值。
为了安全起见,请按照hroncok's answer中的建议进行检查:
import sys
virtualenv_prefix = getattr(sys, "real_prefix", None)
venv_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = virtualenv_prefix or venv_prefix != sys.prefix
如果您使用的是Anacona虚拟环境,请检查 Victoria Stuart's answer。
答案 6 :(得分:3)
我经常使用几个Anaconda安装的虚拟环境(venv)。此代码段/示例使您可以确定您是否在venv(或您的系统环境)中,并且还需要特定的venv用于您的脚本。
# ----------------------------------------------------------------------------
# Want script to run in Python 3.5 (has required installed OpenCV, imutils, ... packages):
import os
# First, see if we are in a conda venv { py27: Python 2.7 | py35: Python 3.5 | tf: TensorFlow | thee : Theano }
try:
os.environ["CONDA_DEFAULT_ENV"]
except KeyError:
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# If we are in a conda venv, require the p3 venv:
if os.environ['CONDA_DEFAULT_ENV'] != "py35":
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# See also:
# Python: Determine if running inside virtualenv
# http://stackoverflow.com/questions/1871549/python-determine-if-running-inside-virtualenv
# [ ... SNIP! ... ]
$ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
$ thee
[Theano in Anaconda Python 2.7 venv (source activate theano-env)]
(theano-env) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(theano-env) $ tf
[TensorFlow in Anaconda Python 2.7 venv (source activate tf-env]
(tf-env) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(tf-env) $ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam_cv3_v2_fps_v2c.py -n50
current env: py35
processing (live): found 2 faces and 4 eyes in this frame
threaded OpenCV implementation
num_frames: 50
webcam -- approx. FPS: 18.59
Found 2 faces and 4 eyes!
(py35) $ sd
[Anaconda venv deactivate (source deactivate)]
$ python webcam_cv3_v2_fps_v2c.py -n50
Please set the py35 { p3 | Python 3.5 } environment!
$ ## Q.E.D. ;-)
您还可以在bash脚本中使用此方法(例如,必须在特定虚拟环境中运行的脚本)。示例(添加到bash脚本):
# ----------------------------------------------------------------------------
# Excerpt from: /mnt/Vancouver/Programming/scripts/tf_tb_del.sh ## tf_tb_del: tf_tensorboard_delete
# [bash script run on command-line: calls TensorFlow-related commands, therefore must be run in tf-env venv]
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in bash)!
then
printf '\n\tvenv: tf-env\n'
else
printf '\n\n\t*******************************************************************\n'
printf '\t*** NOTE! Must run this script in tf-env virtual environment! ***\n'
printf '\t*******************************************************************'
exit
fi
## [ ... snip ... ]
答案 7 :(得分:3)
要检查您的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")}')
答案 8 :(得分:3)
您可以执行return
并查看其是否指向虚拟环境中的那个。
答案 9 :(得分:1)
(编辑)我发现了这种方式,您如何看待它? (它还返回venv基本路径,甚至可用于 readthedocs ,其中检查 env 变量不是这样):
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'] + '/../')
答案 10 :(得分:0)
它不是防弹的,但对于UNIX环境,简单的测试就像
if run("which python3").find("venv") == -1:
# something when not executed from venv
对我很有用。它比测试某些属性的现有更简单,无论如何,你应该命名你的venv目录venv
。
答案 11 :(得分:0)
在Windows操作系统中,您会看到如下内容:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
括号表示您实际上处于名为“virtualEnvName”的虚拟环境中。
答案 12 :(得分:0)
潜在的解决方案是:
os.access(sys.executable, os.W_OK)
在我的情况下,我真的只想检测我是否可以按原样安装pip项目。虽然它可能不适合所有情况,但请考虑检查您是否具有Python可执行文件位置的写权限。
注意:这适用于所有版本的Python,但如果您使用True
运行系统Python,也会返回sudo
。这是一个潜在的用例:
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'])
答案 13 :(得分:0)
这是一个古老的问题,但是上面的例子太多了。
保持简单:(在Windows 10上的Jupyter Notebook或Python 3.7.1终端中)
import sys
print(sys.executable)```
# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`
OR
```sys.base_prefix```
# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'
答案 14 :(得分:0)
最简单的方法是运行:which python
,如果您位于virtualenv中,它将指向其python而不是全局的python
答案 15 :(得分:-1)
这里已经发布了很多很棒的方法,但是只添加了一个:
import site
site.getsitepackages()
告诉您pip
安装软件包的位置。