当前位置:  开发笔记 > 编程语言 > 正文

确定Python是否在virtualenv中运行

如何解决《确定Python是否在virtualenv中运行》经验,为你挑选了9个好方法。

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



1> Carl Meyer..:

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 activateshell脚本设置,但是通过直接运行virtualenv bin/(或Scripts)目录中的可执行文件,可以在不激活的情况下使用virtualenv ,在这种情况下$VIRTUAL_ENV不会设置.


如果您正在使用virtualenv(github.com/pypa/virtualenv),这个答案对于Python 2或Python 3同样正确.如果您使用的是pyvenv(http://legacy.python.org/dev/peps/pep-0405 /),一个内置于Python 3.3+中的virtualenv等价物(但与virtualenv不同),然后它使用sys.base_prefix而不是sys.real_prefix,并且sys.base_prefix始终存在; 在pyvenv之外,它等于sys.prefix.
这在Python 3中似乎不再有效.
@Kounavi我认为Windows版本可能不会产生任何影响.这个答案是virtualenv如何在任何平台上运行的核心部分.您是否有可能在Windows 2012计算机上使用Python 3 pyvenv,而不是virtualenv?或者说PATH正在发生什么事情,当你认为自己时,你实际上并没有在virtualenv中运行?
bash脚本的一线脚本`PYTHON_ENV = $(python -c“ import sys;如果hasattr(sys,'real_prefix')则为sys.stdout.write('1')否则为sys.stdout.write('0')”) `

2> loki l..:

尝试使用pip -V(注意资本V)

如果您正在运行虚拟环境.它将显示env.的位置路径.



3> hroncok..:

这是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_prefixsys.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 


由于大多数Python 3框架和应用程序不再维护或支持Python 3.3,因此该函数现在简化为一个简单的代码:`def is_venv():return hasattr(sys,'real_prefix')或sys.base_prefix!= sys .prefix`。*只是在说'。*

4> 小智..:

使用$ VIRTUAL_ENV变量确实会检查我们是否在虚拟环境中,但问题可能在于当我们离开virtualenv时无法清除此变量的deactivate函数.


deactivate确实清除了这个变量

5> 小智..:

根据http://www.python.org/dev/peps/pep-0405/#specification上的virtualenv pep,您可以使用sys.prefix而不是os.environ ['VIRTUAL_ENV'].

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


virtualenv是适用于任何Python版本的独立项目(https://github.com/pypa/virtualenv).您链接到的PEP用于pyvenv,它基于virtualenv,但实现方式不同(更好),内置于Python 3.3+.这个问题是关于virtualenv,而不是pyvenv.你是正确的,在pyvenv中没有``sys.real_prefix``.
使用这个答案从bash中检测的一个好方法是运行:`env | grep VIRTUAL_ENV | wc -l`如果在venv中则返回1,否则返回0.
如果您在shell中,则可以根据需要简单地使用`[[--n $ VIRTUAL_ENV]] && echo virtualenv`或`[[-z $ VIRTUAL_ENV]] && echo not virtualenv`。

6> Matt Harasym..:

要检查您的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")}')



7> kunrazor..:

您可以which python查看虚拟环境中是否指向该环境。



8> Victoria Stu..:

更新于2019年11月(附加)。


我通常使用几个Anaconda安装的虚拟环境(venv)。此代码片段/示例使您可以确定是否处于venv(或系统环境)中,并且还需要脚本使用特定的venv。

添加到Python脚本(代码段):

# ----------------------------------------------------------------------------
# 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! ... ]

例:

$ p2
  [Anaconda Python 2.7 venv (source activate py27)]

(py27) $ python  webcam_.py
    Please set the py35 { p3 | Python 3.5 } environment!

(py27) $ p3
  [Anaconda Python 3.5 venv (source activate py35)]

(py35) $ python  webcam.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) $

更新1-在bash脚本中使用:

您也可以在bash脚本中使用此方法(例如,必须在特定虚拟环境中运行的脚本)。示例(添加到bash脚本中):

if [ $CONDA_DEFAULT_ENV ]        ## << note the spaces (important in BASH)!
    then
        printf 'venv: operating in tf-env, proceed ...'
    else
        printf 'Note: must run this script in tf-env venv'
        exit
fi

更新2 [2019年11月]

为简单起见,我喜欢Matt的答案(/sf/ask/17360801/)。

自从我的原始文章以来,我已经从Anaconda venv转移了(Python本身已经发展了viz -a- viz 虚拟环境)。

重新检查此问题,以下是一些更新的Python代码,您可以将其插入以测试您是否在特定的Python虚拟环境(venv)中运行。

import os, re
try:
    if re.search('py37', os.environ['VIRTUAL_ENV']):
        pass
except KeyError:
    print("\n\tPlease set the Python3 venv [alias: p3]!\n")
    exit()

这是一些解释性代码。

[victoria@victoria ~]$ date; python --version
  Thu 14 Nov 2019 11:27:02 AM PST
  Python 3.8.0

[victoria@victoria ~]$ python
  Python 3.8.0 (default, Oct 23 2019, 18:51:26) 
  [GCC 9.2.0] on linux
  Type "help", "copyright", "credits" or "license" for more information.

>>> import os, re

>>> re.search('py37', os.environ['VIRTUAL_ENV'])


>>> try:
...     if re.search('py37', os.environ['VIRTUAL_ENV']):
...       print('\n\tOperating in Python3 venv, please proceed!  :-)')
... except KeyError:
...     print("\n\tPlease set the Python3 venv [alias: p3]!\n")
... 

    Please set the Python3 venv [alias: p3]!

>>> [Ctrl-d]
  now exiting EditableBufferInteractiveConsole...

[victoria@victoria ~]$ p3
  [Python 3.7 venv (source activate py37)]

(py37) [victoria@victoria ~]$ python --version
  Python 3.8.0

(py37) [victoria@victoria ~]$ env | grep -i virtual
  VIRTUAL_ENV=/home/victoria/venv/py37

(py37) [victoria@victoria ~]$ python
  Python 3.8.0 (default, Oct 23 2019, 18:51:26) 
  [GCC 9.2.0] on linux
  Type "help", "copyright", "credits" or "license" for more information.

>>> import os, re
>>> try:
...     if re.search('py37', os.environ['VIRTUAL_ENV']):
...       print('\n\tOperating in Python3 venv, please proceed!  :-)')
... except KeyError:
...     print("\n\tPlease set the Python3 venv [alias: p3]!\n")
... 

    Operating in Python3 venv, please proceed!  :-)
>>> 



9> florisla..:

这里有多个好的答案,而有些则不太健壮。这里是概述。

怎么不做

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

如果将它们设置为非标准位置,则并不意味着您实际上在虚拟环境中。用户可以安装多个Python版本,而这些版本并不总是位于您期望的位置。

避免看:

sys.executable

sys.prefix

pip -V

which python

此外,不检查的情况下venv.venv或者envs在任何这些路径。对于具有更独特位置的环境,这将不起作用。例如, Pipenv使用哈希值作为其环境的名称。

VIRTUAL_ENV 环境变量

两者virtualenvvenv设置环境变量$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

您可以在不激活环境的情况下启动环境的脚本,因此,如果这是一个问题,则必须使用其他方法。

sys.real_prefixsys.base_prefix

sys.prefix如您所料,Virtualenv指向安装在virtualenv内部的Python。

同时,的原始sys.prefix也可以作为的新属性使用syssys.real_prefix。这就是我们用来检测我们是否在virtualenv中的方法。

import sys
running_in_virtualenv = hasattr(sys, "real_prefix")

还有一个问题,但:venvpyvenv来自做到这一点不同virtualenv-他们不设置real_prefix。而是将它们设置base_prefix为与的不同值sys.prefix

为了安全起见,请按照hroncok的答案中的建议进行检查:

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的答案。

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有