現在のスクリプトが virtualenv 環境内で実行されているかどうかを判断することはできますか?
15 に答える
これを確認する最も信頼できる方法は、sys.prefix == sys.base_prefix
. それらが等しい場合、あなたは仮想環境にいません。それらが等しくない場合、あなたはそうです。仮想環境内では、仮想環境をsys.prefix
指しsys.base_prefix
、virtualenv が作成されたシステム Python のプレフィックスです。
上記は、Python 3 stdlibvenv
および最近のvirtualenv
バージョン (バージョン 20 以降) では常に機能します。の代わりにvirtualenv
使用された(そして仮想環境の外には存在しなかった)の古いバージョン、および Python 3.3 以前では存在しませんでした。したがって、これらすべてのケースを処理する完全に堅牢なチェックは次のようになります。sys.real_prefix
sys.base_prefix
sys.real_prefix
sys.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 のみを気にする場合virtualenv
はget_base_prefix_compat()
、単純にsys.base_prefix
.
VIRTUAL_ENV
環境変数の使用は信頼できません。これは virtualenv シェル スクリプトによって設定されますが、virtualenv の(または) ディレクトリactivate
から実行可能ファイルを直接実行することで、アクティブ化せずに virtualenv を使用できます。この場合は設定されません。または、virtualenv がシェルでアクティブ化されている間に、virtualenv 以外の Python バイナリを直接実行できます。この場合、その virtualenv で実際には実行されていない Python プロセスで設定できます。bin/
Scripts
$VIRTUAL_ENV
$VIRTUAL_ENV
$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 スクリプトの外部でも実行できます。
http://www.python.org/dev/peps/pep-0405/#specificationの virtualenv pep によると、sys.prefix
代わりに使用できますos.environ['VIRTUAL_ENV']
。
これsys.real_prefix
は私のvirtualenvには存在せず、sys.base_prefix
.
- 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 月]
- 簡単にするために、マットの答えが好きです(https://stackoverflow.com/a/51245168/1904943)。
最初の投稿以来、私は 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! :-)
>>>
(編集済み)私はその方法を見つけました、あなたはそれについてどう思いますか?(また、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'] + '/../')
Windows OS では、次のように表示されます。
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
括弧は、実際に「virtualEnvName」という仮想環境にいることを意味します。