現在のスクリプトがvirtualenv環境内で実行されているかどうかを判断することは可能ですか?
知る限り、これを確認する最も信頼できる方法(および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 activate
Shellスクリプトによって設定されますが、virtualenvのbin/
(またはScripts
)ディレクトリから実行可能ファイルを直接実行することにより、アクティベーションなしでvirtualenvを使用できます。この場合、$VIRTUAL_ENV
は設定されません。
pip -V
(大文字Vに注意)を使用してみてください
仮想環境を実行している場合。環境の場所へのパスが表示されます。
これは、 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_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/pep-0405/#specification のvirtualenv pepによると、os.environ ['VIRTUAL_ENV']の代わりにsys.prefixを使用できます。
sys.real_prefixは私のvirtualenvに存在せず、sys.base_prefixと同じです。
which python
を実行して、仮想env内のものを指しているかどうかを確認できます。
内部の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")}')
私は定期的にいくつかのAnacondaがインストールされた仮想環境(venv)を使用しています。このコードスニペット/サンプルを使用すると、venv(またはシステム環境)にいるかどうかを判断したり、スクリプトに特定のvenvを要求したりできます。
# ----------------------------------------------------------------------------
# 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 ... ]
(編集)私はそのように見つけました、あなたはそれについてどう思いますか? (また、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'] + '/../')
これは古い質問ですが、上記の例が多すぎると複雑すぎます。
シンプルに保つ:(Windows 10のJupyter Notebookまたは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
がパッケージをインストールした場所を示します。
これは防弾ではありませんが、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」と呼ばれる仮想環境にいることを意味します。
potentialソリューションは次のとおりです。
os.access(sys.executable, os.W_OK)
私の場合、pipを使用してアイテムをインストールできるかどうかを検出したかっただけです。すべての場合に適切なソリューションとは限りませんが、Python実行可能ファイルの場所に対する書き込み権限があるかどうかを単純に確認することを検討してください。
注:これはすべてのバージョンのPythonで機能しますが、PythonをTrue
で実行すると、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'])
最も簡単な方法は、単にwhich python
を実行することです。virtualenvを使用している場合、グローバルではなくpythonを指します。