Pythonはvirtualenvの内部で実行されているかどうかを確認します
-
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スクリプトの外で行うことができます。
http://www.python.org/dev/peps/でvirtualenvののPEPによると、あなただけの代わりに[ 'VIRTUAL_ENV']。
はos.environはsys.prefixを使用することができますのPEP-0405 /#仕様sys.real_prefixは私のvirtualenvの中に存在し、sys.base_prefixと同じません。
あなたは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スクリプトで使用します。
# ----------------------------------------------------------------------------
# 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 ... ]
最も簡単な方法は、単に実行することです:あなたは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
パッケージをインストールした場所を示しています。