질문
현재 스크립트가 가상 환경 내에서 실행되고 있는지 확인할 수 있을까요?
답변
신뢰할 수 있고 문서화된 방법은 sys.prefix
와 sys.base_prefix
를 비교하는 것입니다. 동일하다면 가상 환경이 아니고, 그렇지 않다면 가상 환경입니다. 가상 환경 안에서 sys.prefix
는 가상 환경의 디렉토리를 가리키고, sys.base_prefix
는 환경을 생성한 Python 인터프리터를 가리킵니다.
이는 venv의 작동 방식에 문서화되어 있습니다:
현재 인터프리터가 가상 환경에서 실행 중인지 확인하려면
sys.prefix != sys.base_prefix
를 확인하는 것만으로 충분합니다.
이 방법은 Python 표준 라이브러리인 venv
와 virtualenv
(버전 20부터)에서 작동합니다:
def in_venv():
return sys.prefix != sys.base_prefix
이전 버전의 virtualenv
는 sys.real_prefix
대신에 sys.base_prefix
를 사용했으며, sys.real_prefix
는 가상 환경 외부에는 존재하지 않았습니다. Python 3.3 이전에는 sys.base_prefix
가 존재하지 않았습니다. 따라서 일부 이전 버전을 처리하는 확인 방법은 다음과 같을 수 있습니다:
import sys
def get_base_prefix_compat():
"""기본/실제 접두사 또는 없는 경우 sys.prefix를 가져옵니다."""
return (
getattr(sys, "base_prefix", None)
or getattr(sys, "real_prefix", None)
or sys.prefix
)
def in_virtualenv():
return sys.prefix != get_base_prefix_compat()
VIRTUAL_ENV
환경 변수를 사용하는 것은 신뢰할 수 없습니다. 이는 가상 환경의 activate
쉘 스크립트에서 설정되지만, 가상 환경은 가상 환경의 bin/
(또는 Scripts
) 디렉토리에서 직접 실행 가능한 파일을 실행하여 활성화되지 않고 사용될 수 있습니다. 또는 가상 환경이 쉘에서 활성화된 상태에서 비가상 환경 Python 실행 파일이 직접 실행될 수 있으며, 이 경우 실제로는 해당 가상 환경에서 실행되지 않는 Python 프로세스에서 $VIRTUAL_ENV
가 설정될 수 있습니다.
댓글