Python:确定是否在virtualenv内运行

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

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环境variables是不可靠的。 它由virtualenv activate shell脚本设置,但是virtualenv可以直接从virtualenv的bin/ (或Scripts )目录下运行一个可执行文件而不用激活,在这种情况下$VIRTUAL_ENV不会被设置。

使用$ VIRTUAL_ENVvariables确实会检查我们是否在虚拟环境中,但是问题可能是当我们离开virtualenv时,取消激活函数不能清除这个variables。

根据http://www.python.org/dev/peps/pep-0405/#specification的virtualenv pep,你可以使用sys.prefix来代替os.environ ['VIRTUAL_ENV']。

sys.real_prefix不存在于我的virtualenv中,与sys.base_prefix相同。

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

如果你正在运行虚拟环境。 它会显示通往env的位置的path。

这是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.real_prefix中非空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 

这不是防弹的,但对于UNIX环境来说简单的testing就像

 if run("which python3").find("venv") == -1: # something when not executed from venv 

对我很好。 testing一些属性的存在会更简单,无论如何,你应该命名venv目录venv

我经常使用几个Anaconda安装的虚拟环境(venv)。 这个代码片段/示例使您能够确定您是否在venv(或您的系统环境)中,并且还需要特定的脚本。

添加到PYTHON SCRIPT(代码片段):

 # ---------------------------------------------------------------------------- # 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! $ ## QED ;-) 

更新:在bash脚本中使用:

您也可以在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 ... ] 

在Windows操作系统,你看到这样的事情:

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

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

(编辑)我find了,你觉得呢? (它也返回venv的基本path,即使是在检查envvariables的readthedoc也不行):

 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'] + '/../')