[python] Python이 virtualenv 내에서 실행 중인지 확인

현재 스크립트가 virtualenv 환경 내에서 실행 중인지 확인할 수 있습니까?



답변

AFAIK 가장 확실한 확인 방법 (virtualv 및 pip에서 내부적으로 사용되는 방법)은 다음을 확인하는 것입니다 sys.real_prefix.

import sys

if hasattr(sys, 'real_prefix'):
    #...

VIRTUALENV 내부 sys.prefixVIRTUALENV 디렉토리에 포인트 및 sys.real_prefix시스템 파이썬 (보통의 “진짜”접두사 포인트 /usr/usr/local또는 일부 등).

virtualenv 외부에는 sys.real_prefix존재하지 않아야합니다.

VIRTUAL_ENV환경 변수를 사용하는 것은 신뢰할 수 없습니다. virtualenv activate쉘 스크립트에 의해 설정 되지만 virtualenv bin/(또는 Scripts) 디렉토리 에서 실행 파일을 직접 실행하여 활성화하지 않고 virtualenv를 사용할 수 있습니다 .이 경우 $VIRTUAL_ENV설정되지 않습니다.


답변

사용해보십시오 pip -V(자본 V)

가상 환경을 실행중인 경우 환경의 위치에 대한 경로가 표시됩니다.


답변

이것은 Carl Meyer의 대답에 대한 개선입니다 . 그것은 작동 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와 동일합니다.


답변

내부 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")}')


답변

여기에는 여러 가지 좋은 답변이 있으며 덜 견고한 답변이 있습니다. 개요는 다음과 같습니다.

하지 않는 방법

파이썬이나 site-packages폴더 의 위치에 의존하지 마십시오 .

이러한 위치가 비표준 위치로 설정되어 있어도 실제로 가상 환경에있는 것은 아닙니다 . 사용자는 둘 이상의 Python 버전을 설치할 수 있으며 항상 원하는 위치에있는 것은 아닙니다.

다음을 보지 마십시오.

  • sys.executable
  • sys.prefix
  • pip -V
  • which python

또한,의 존재를 확인하지 않는 venv, .venv또는 envs이러한 경로 중 하나입니다. 위치가 더 고유 한 환경에서는 문제가 발생합니다. 예를 들어
Pipenv 는 해시 값을 해당 환경의 이름으로 사용합니다.

VIRTUAL_ENV 환경 변수

모두 virtualenvvenv환경 변수를 설정 $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, venvpyvenv포인트 sys.prefix당신이 예상하는대로 파이썬은 내부 VIRTUALENV의 설치.

동시에의 원래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의 답변을 확인하십시오
.