Pythonはvirtualenvの内部で実行されているかどうかを確認します

StackOverflow https://stackoverflow.com/questions/1871549

  •  18-09-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

これをチェックするための最も確実な方法(とvirtualenvの中やピップで内部的に使用されている方法)私の知る限り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シェルスクリプトによって設定されているが、virtualenvの直接ケースbin/が設定されませんているvirtualenvののScripts(又は$VIRTUAL_ENV)ディレクトリから実行可能ファイルを実行することによって活性化することなく使用することができる。

他のヒント

pip -V(通知資本V)を使用してみてください。

あなたは仮想のenvを実行している場合。それはENVへのパスを表示します。の場所を。

これはhref="https://stackoverflow.com/users/3207/carl-meyer">カールマイヤーの virtualenvのので動作します:/ /docs.python.org/3/library/venv.html」REL = "noreferrer"> venv のモジュールはPython 3:

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 

$VIRTUAL_ENV環境変数を確認します。

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

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

あなたはdeactivateを実行すると/仮想環境を残し、$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スクリプトの外で行うことができます。

あなたはwhich pythonを行うと、その仮想ENVに1を指しているかどうかを確認することができます。

あなたの内側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")}')

私は定期的にいくつかのアナコンダ-インストール仮想環境(venv)を使用します。このコードスニペット/例は、あなたが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!

$ ## Q.E.D.  ;-)

更新:の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 ... ]
最も簡単な方法は、単に実行することです:あなたはvirtualenvのであるならば、それは代わりにグローバルなもののそののpythonを指すようになります、which python

私はその方法を見つけた(編集済み)、あなたはそれをどう思いますか? (それはまた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'] + '/../')

これは防弾ではありませんが、UNIX用の

のような簡単なテストを環境
if run("which python3").find("venv") == -1:
    # something when not executed from venv

私のために素晴らしい作品。それはとにかく、いくつかの属性の既存のテストをして、簡単です、あなたはあなたのvenvディレクトリvenvに名前を付ける必要があります。

のWindows OSでは、あなたがこのような何かを参照してください。

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

括弧は、あなたが「virtualEnvName」と呼ばれる仮想環境で実際にあることを意味します。

A の可能性のソリューションは、次のとおりです。

os.access(sys.executable, os.W_OK)

私の場合、私は本当にただであるように私は、ピップでアイテムをインストールすることができますかどうかを検出したかったです。それはすべての場合に適したソリューションではないかもしれませんが、あなたが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'])

この古い質問ですが、あまりにも多くの例は、上記過複雑である。

それをシンプルに保つ:(JupyterノートブックまたはWindows 10上の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'

偉大な方法がたくさんあり、すでにここに掲載さが、ちょうど1以上を追加している。

import site
site.getsitepackages()

pipパッケージをインストールした場所を示しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top