본문 바로가기
Python/Python FAQ

Python 가상환경 안에서 파이썬이 실행 중인지 확인하세요., Determine if Python is running inside virtualenv

by 베타코드 2023. 10. 24.
반응형

질문


현재 스크립트가 가상 환경 내에서 실행되고 있는지 확인할 수 있을까요?


답변


신뢰할 수 있고 문서화된 방법은 sys.prefixsys.base_prefix를 비교하는 것입니다. 동일하다면 가상 환경이 아니고, 그렇지 않다면 가상 환경입니다. 가상 환경 안에서 sys.prefix는 가상 환경의 디렉토리를 가리키고, sys.base_prefix는 환경을 생성한 Python 인터프리터를 가리킵니다.

이는 venv의 작동 방식에 문서화되어 있습니다:

현재 인터프리터가 가상 환경에서 실행 중인지 확인하려면 sys.prefix != sys.base_prefix를 확인하는 것만으로 충분합니다.

이 방법은 Python 표준 라이브러리인 venvvirtualenv (버전 20부터)에서 작동합니다:

def in_venv():
    return sys.prefix != sys.base_prefix

이전 버전의 virtualenvsys.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가 설정될 수 있습니다.

반응형

댓글