Python이 virtualenv 내에서 실행 중인지 확인
현재 확장가 virtualenv 환경 내에서 실행 중에 지칠 수 없는가?
AFAIK는 다음과 같은 확인을하는 것입니다 sys.real_prefix
.
import sys
if hasattr(sys, 'real_prefix'):
#...
VIRTUALENV 내부 sys.prefix
VIRTUALENV 공간 및 포인트 및 sys.real_prefix
시스템 개수 (보통의 "진짜"접두사 포인트 /usr
나 /usr/local
또는 다른 것 등).
virtualenv 외부에 sys.real_prefix
존재하지 않습니다.
VIRTUAL_ENV
환경 변수를 사용하십시오 . VIRTUALENV activate
쉘 펼쳐에 의해 설정 되지만 VIRTUALENV bin/
(또는 Scripts
) 디렉토리 에서 실행 파일을 직접 실행하여 활성화하지 않고 VIRTUALENV를 사용할 수 있습니다 . 경우이 $VIRTUAL_ENV
설정되지 않습니다.
비타민 성분 pip -V
(자본 V)
가상 환경을 실행할 수 있습니다.
이것은 칼 마이어의 대답에, 대한 개선입니다 . 그것은 작동 VIRTUALENV 파이썬 3과 2 및도에 대한 venv의 파이썬 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
가상 환경 커버링 venv sys.base_prefix
와 유연성 virtualenv 커버를 확인합니다 sys.prefix
.
다음과 같은 기능을 사용하십시오.
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
변수가 지워집니다. KeyError
환경 변수가 설정되지 않았기 때문에 파이썬은 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에 따르면 os.environ [ 'VIRTUAL_ENV'] 대신 sys.prefix를 사용할 수 있습니다.
sys.real_prefix가 내 virtualenv에 없으며 sys.base_prefix와 동일합니다.
which python
가상 환경에서 가상 환경을 가리키고 있는지 확인할 수 있습니다 .
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를 요구할 수도 있습니다.
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 ... ]
가장 쉬운 방법은 다음을 실행하는 것입니다. which python
, virtualenv에 있으면 전역이 아닌 파이썬을 가리 킵니다.
(편집) 그 방법을 찾았습니다. 어떻게 생각하십니까? (또한 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'] + '/../')
방탄은 아니지만 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"이라는 가상 환경에 있음을 의미합니다.
잠재적 인 솔루션입니다 :
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'
이미 여기에 게시 된 훌륭한 방법이 많이 있지만 하나만 추가하면됩니다.
import site
site.getsitepackages()
pip
패키지 가 설치된 위치를 알려줍니다 .
여기에는 여러 가지 좋은 답변이 있으며 덜 견고한 답변이 있습니다. 개요는 다음과 같습니다.
하지 않는 방법
파이썬이나 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.real_prefix
과 sys.base_prefix
Virtualenv sys.prefix
는 예상대로 virtualenv 내부에 설치된 Python을 가리 킵니다 .
동시에, 원래 의 값은 sys.prefix
또한 새로운 속성으로 사용할 수 있습니다 sys
: sys.real_prefix
. 이것이 우리가 virtualenv에 있는지 감지하기 위해 사용하는 것입니다.
import sys
running_in_virtualenv = hasattr(sys, "real_prefix")
그래도 문제가 있습니다 : venv
그리고 pyvenv
다르게 virtualenv
설정하십시오 real_prefix
. 대신에 base_prefix
다른 값으로 설정 되었습니다 sys.prefix
.
안전을 위해 hroncok 답변의 에서 제안한대로 두 가지를 모두 확인하십시오 .
import sys
virtualenv_prefix = getattr(sys, "real_prefix", None)
venv_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = virtualenv_prefix or venv_prefix != sys.prefix
아나콘다
아나 코나 가상 환경을 사용하는 빅토리아 스튜어트의 답변을 확인하십시오 .
참고 URL : https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv
'IT story' 카테고리의 다른 글
해당 함수 내에서 함수 이름을 얻는 방법은 무엇입니까? (0) | 2020.04.13 |
---|---|
Subversion의 트렁크, 분기 및 태그 란 무엇입니까? (0) | 2020.04.13 |
Git을 사용하는 여러 작업 디렉토리? (0) | 2020.04.13 |
사전에 키가 포함되어 있는지 확인하는 것이 왜 더 빠르지 않은지 예외를 잡는 것보다 더 빠른 이유는 무엇입니까? (0) | 2020.04.13 |
Linux에서 지연 및 손실 된 패킷 시뮬레이션 (0) | 2020.04.13 |