374

現在のスクリプトが virtualenv 環境内で実行されているかどうかを判断することはできますか?

4

15 に答える 15

278

これを確認する最も信頼できる方法は、sys.prefix == sys.base_prefix. それらが等しい場合、あなたは仮想環境にいません。それらが等しくない場合、あなたはそうです。仮想環境内では、仮想環境をsys.prefix指しsys.base_prefix、virtualenv が作成されたシステム Python のプレフィックスです。

上記は、Python 3 stdlibvenvおよび最近のvirtualenvバージョン (バージョン 20 以降) では常に機能します。の代わりにvirtualenv使用された(そして仮想環境の外には存在しなかった)の古いバージョン、および Python 3.3 以前では存在しませんでした。したがって、これらすべてのケースを処理する完全に堅牢なチェックは次のようになります。sys.real_prefixsys.base_prefixsys.real_prefixsys.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 バージョンと latest のみを気にする場合virtualenvget_base_prefix_compat()、単純にsys.base_prefix.

VIRTUAL_ENV環境変数の使用は信頼できません。これは virtualenv シェル スクリプトによって設定されますが、virtualenv の(または) ディレクトリactivateから実行可能ファイルを直接実行することで、アクティブ化せずに virtualenv を使用できます。この場合は設定されません。または、virtualenv がシェルでアクティブ化されている間に、virtualenv 以外の Python バイナリを直接実行できます。この場合、その virtualenv で実際には実行されていない Python プロセスで設定できます。bin/Scripts$VIRTUAL_ENV$VIRTUAL_ENV

于 2009-12-10T19:07:58.100 に答える
74

$VIRTUAL_ENV環境変数を確認してください。

環境変数には、アクティブな仮想環境にあるときの$VIRTUAL_ENV仮想環境のディレクトリが含まれます。

>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'

deactivate仮想環境を実行/終了すると、$VIRTUAL_ENV変数はクリア/空になります。KeyError環境変数が設定されていないため、Python は a を発生させます。

>>> 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 スクリプトの外部でも実行できます。

于 2015-02-07T22:17:31.933 に答える
27

http://www.python.org/dev/peps/pep-0405/#specificationの virtualenv pep によると、sys.prefix代わりに使用できますos.environ['VIRTUAL_ENV']

これsys.real_prefixは私のvirtualenvには存在せず、sys.base_prefix.

于 2012-05-24T18:15:59.747 に答える
7
  • 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 月]

最初の投稿以来、私は Anaconda venv から移行しました (そして Python 自体がviz-a-viz仮想環境を進化させました)。

この問題を再検討して、特定の Python 仮想環境 (venv) で動作していることをテストするために挿入できる、いくつかの更新された Python コードを次に示します。

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'])
<re.Match object; span=(20, 24), match='py37'>

>>> 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!  :-)
>>> 
于 2016-10-18T03:35:08.557 に答える
1

(編集済み)私はその方法を見つけました、あなたはそれについてどう思いますか?(また、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'] + '/../')
于 2017-07-16T07:26:30.483 に答える
-1

Windows OS では、次のように表示されます。

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

括弧は、実際に「virtualEnvName」という仮想環境にいることを意味します。

于 2017-07-07T14:58:15.350 に答える