現在のスクリプトがvirtualenv環境内で実行されているかどうかを確認することはできますか?
現在のスクリプトが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
シェルスクリプトによって設定されますが、virtualenvのbin/
(またはScripts
)ディレクトリから実行可能ファイルを直接実行することにより、アクティベーションなしでvirtualenvを使用できます$VIRTUAL_ENV
。
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
pip -V
(通知大文字V)を使用してみてください
仮想環境を実行している場合。環境の場所へのパスが表示されます。
virtualenv
たくさんあなたの周りを動かしたならば、これは失敗するか、あなたに嘘をつく可能性があります。それが嘘をついているなら、あなたはすることができますfind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
。それが失敗する場合(「悪いマーシャルデータ」を取得した場合)は、.pycファイルをワイプする必要がありますfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(心配しないでください。自動的に再構築されます)。
...\lib\site-packages
に%PATH%
。したがって、その場合は誤検知が返されます。
これは、カールマイヤーが認めた回答の改善版です。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
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
。言ってるだけ'。
pipenv
作成された仮想環境では機能しないようです。
$VIRTUAL_ENV
環境変数を確認してください。
$VIRTUAL_ENV
ときアクティブな仮想環境での環境変数は、仮想環境のディレクトリが含まれています。
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
deactivate
仮想環境を実行/終了すると、$VIRTUAL_ENV
変数はクリア/空になります。KeyError
環境変数が設定されていないため、Pythonはを発生させます。
>>> 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スクリプトの外部のシェルでも実行できます。
virtualenv
virtualenvとvirtualenvの両方でvenv
機能します。
http://www.python.org/dev/peps/pep-0405/#specificationのvirtualenv pepによると、os.environ ['VIRTUAL_ENV']の代わりにsys.prefixを使用できます。
sys.real_prefixは私のvirtualenvには存在せず、sys.base_prefixと同じです。
sys.real_prefix
。
env |grep VIRTUAL_ENV |wc -l
これは、envの場合は1を返し、そうでない場合は0を返します。
[[ -n $VIRTUAL_ENV ]] && echo virtualenv
または単に使用でき[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
ます。
内部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")}')
ここには良い答えがいくつかありますが、堅牢性の低いものもあります。ここに概要があります。
Pythonやsite-packages
フォルダの場所に依存しないでください。
これらが標準以外の場所に設定されている場合でも、実際に仮想環境にいるわけではありません。ユーザーは複数のバージョンのPythonをインストールできますが、それらのバージョンは必ずしも期待どおりではありません。
見ないでください:
sys.executable
sys.prefix
pip -V
which python
また、の存在venv
、.venv
またはenvs
これらのパスのいずれかを確認しないでください。これは、より固有の場所を持つ環境では機能しなくなります。たとえば、
Pipenvはその環境の名前としてハッシュ値を使用します。
VIRTUAL_ENV
環境変数両方とも、環境をアクティブにするときに環境変数virtualenv
をvenv
設定し$VIRTUAL_ENV
ます。PEP 405を参照してください。
この変数をシェルスクリプトで読み取るか、この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.base_prefix
virtualenv
、venv
そして予想通り、virtualenv内にインストールされたPython をpyvenv
ポイントsys.prefix
します。
同時に、の元の値sys.prefix
もとして利用できますsys.base_prefix
。
これを使用して、virtualenvにいるかどうかを検出できます。
import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix
sys.real_prefix
virtualenv
バージョン20がsys.base_prefix
設定されsys.real_prefix
ず、代わりに設定される前に注意してください。
安全のため、hroncokの回答で提案されているように両方を確認してください:
import sys
real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix
Anaconda仮想環境を使用している場合は、Victoria Stuartの回答を確認してください 。
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
テストのみに依存していたが、それはもはや機能しなかった。
あなたはそれwhich python
が仮想環境のものを指しているかどうかを確認することができます。
which
Windowsではデフォルトでは使用できません。where
Windowsで代わりに使用するか、whichcraftを使用できます。またはを見てくださいsys.executable
。しかし、それでも、より良い方法があります。
私は定期的に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) $
Update 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! :-)
>>>
最も簡単な方法は単に実行which python
することです:、あなたがvirtualenvにいる場合、それはグローバルなものではなくそのpythonを指します
(編集)私はその方法を見つけました、あなたはそれについてどう思いますか?(それは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'] + '/../')
ここにはすでに多くの優れたメソッドが投稿されていますが、もう1つ追加するだけです。
import site
site.getsitepackages()
pip
パッケージをインストールした場所を示します。
site.getsitepackages()
、システムの一つではないのディレクトリ出力、そしてあなたは、仮想環境にいると推論することができます。
virtualenv
。
venv
を使用しているか、またはどちらを使用しているかを通知するのに役立つ可能性があることに同意します。
潜在的な解決策は以下のとおりです。
os.access(sys.executable, os.W_OK)
私の場合、pipをそのまま使用してアイテムをインストールできるかどうかを検出したかっただけです。すべての場合に適切なソリューションとは限りませんが、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'])
これは古い質問ですが、上記の例が多すぎて複雑すぎます。
シンプルに保つ:(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'
envs
そのパスに存在するかどうかを確認するロジックを追加すると、anacondaからvirtualenv
またはに移動したときに機能が停止しますpipenv
。