블로그로 돌아가기
Python

Python venv 가상환경 오류: activate·pip 경로·패키지 설치 실패 진단법

Python venv 오류를 활성화 스크립트 문제, 다른 Python을 가리키는 pip, requirements.txt 설치 실패로 나누어 진단합니다. `python -m pip`과 `sys.prefix != sys.base_prefix`로 실제 실행 환경을 확인하고, 활성화 없이 `.venv` 내부 Python을 직접 실행하는 방법을 설명합니다.

pythonvenv가상환경pip배포문제
Python venv 가상환경에서 activate, pip 경로, 패키지 설치 실패를 진단하는 터미널 화면

venv 오류가 나면 먼저 활성화 명령 자체보다 실행 중인 Python과 pip가 같은 가상환경을 가리키는지 확인하세요. 설치는 항상 python -m pip으로 실행하면, 현재 Python 인터프리터와 연결된 pip를 사용합니다. 활성화는 편의 기능일 뿐 필수는 아니므로, 활성화가 막힌 환경에서는 .venv 내부 Python을 직접 실행할 수 있습니다.

실행 중인 Python부터 확인하기

macOS·Linux에서는 프로젝트 루트에서 다음 명령을 실행합니다.

python3 -m venv .venv source .venv/bin/activate python -c 'import sys; print(sys.executable); print(sys.prefix); print(sys.base_prefix)' python -m pip --version

sys.executablepython -m pip --version의 출력 경로에 .venv가 보이면 해당 가상환경의 Python과 pip를 사용 중입니다. sys.prefix != sys.base_prefix이면 현재 인터프리터는 가상환경에서 실행되고 있는 것입니다.

import sys print(f"Python executable: {sys.executable}") print(f"sys.prefix: {sys.prefix}") print(f"sys.base_prefix: {sys.base_prefix}") print(f"Running in a venv: {sys.prefix != sys.base_prefix}")

디렉터리 경로에 .venvactivate라는 문자열이 포함됐는지로 가상환경 여부를 판단하면, 환경 이름을 다르게 지은 경우 오판할 수 있습니다.

activate가 실행되지 않을 때

bashzsh는 같은 POSIX용 활성화 스크립트를 사용합니다. 따라서 zsh에서 bash 전용 스크립트가 필요하다는 설명은 맞지 않습니다. 다만 fish, csh/tcsh, Windows PowerShell은 각각 전용 스크립트를 호출해야 합니다.

# macOS / Linux: bash, zsh source .venv/bin/activate # fish source .venv/bin/activate.fish # csh, tcsh source .venv/bin/activate.csh
# Windows cmd.exe .venv\Scripts\activate.bat # Windows PowerShell .venv\Scripts\Activate.ps1 # POSIX의 PowerShell(pwsh) .venv/bin/Activate.ps1

POSIX 셸에서 source.은 같은 역할을 합니다. 또한 source는 파일을 현재 셸에서 읽어 실행하므로, activate 파일에 chmod +x를 적용하는 것은 일반적인 해결책이 아닙니다.

Windows PowerShell에서 Activate.ps1이 실행 정책으로 차단될 수 있습니다. 조직 정책을 먼저 확인한 뒤, 사용자 범위 설정이 허용되는 환경이라면 다음 명령을 검토할 수 있습니다.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Python 공식 문서도 PowerShell 활성화 스크립트 실행에 이 설정이 필요할 수 있다고 안내합니다.

활성화 없이 가상환경 사용하기

활성화는 가상환경의 실행 파일 경로를 현재 셸의 PATH 앞에 추가하는 작업입니다. 따라서 활성화가 실패했거나 CI처럼 셸 상태에 의존하고 싶지 않은 경우, 가상환경 내부 Python을 직접 호출하면 됩니다.

# macOS / Linux .venv/bin/python -m pip install -r requirements.txt .venv/bin/python -m pip check
# Windows PowerShell .\.venv\Scripts\python.exe -m pip install -r requirements.txt .\.venv\Scripts\python.exe -m pip check

프로젝트가 pytest를 의존성으로 설치한다면 같은 방식으로 테스트도 실행할 수 있습니다.

.venv/bin/python -m pytest

설치했는데 ModuleNotFoundError가 날 때

다음 명령은 셸의 PATH에 따라 시스템 Python용 pip나 다른 가상환경의 pip를 선택할 수 있습니다.

pip install -r requirements.txt

대신 실행할 Python을 앞에 붙여 설치 대상 환경을 고정합니다.

python -m pip install -r requirements.txt python -m pip --version

python -m pip은 지정한 python 인터프리터로 pip를 실행합니다. 그러므로 활성화하지 않은 상태에서도 아래 명령은 .venv에 설치합니다.

.venv/bin/python -m pip install 패키지이름

command -v python, command -v pip으로 셸이 찾는 실행 파일 경로를 함께 볼 수 있지만, 실제 설치 대상 확인에는 python -m pip --version이 더 직접적입니다.

command -v python command -v pip python -m pip --version

venv 생성이나 pip 준비가 실패할 때

기본적으로 python -m venv .venv는 가상환경 안에 pip를 부트스트랩합니다. --without-pip으로 만들었다면 pip는 생성되지 않습니다. No module named venv처럼 생성 단계에서 실패한다면, 일부 운영체제 배포판에서는 venv 기능이 별도 Python 패키지로 제공될 수 있으므로 현재 배포판의 Python 패키지 구성을 확인해야 합니다.

이미 만든 환경이 의심되면 프로젝트 코드가 아닌 가상환경 디렉터리만 삭제한 뒤 새로 만듭니다.

rm -rf .venv python3 -m venv .venv .venv/bin/python -m pip install --upgrade pip .venv/bin/python -m pip install -r requirements.txt .venv/bin/python -m pip check

rm -rf .venv는 대상 디렉터리를 영구 삭제합니다. 실행 전 현재 위치가 프로젝트 루트인지와 삭제 대상이 정확히 .venv인지 확인해야 합니다.

가상환경은 복사하거나 이동해 재사용하는 대상이 아니라 새 위치에서 재생성하는 대상으로 다루는 편이 안전합니다. 설치된 스크립트가 가상환경 내부 Python의 절대 경로를 가리킬 수 있기 때문입니다. 프로젝트 경로를 옮긴 뒤 실행이 실패했다면 기존 .venv를 삭제하고 새 경로에서 다시 생성하세요.

requirements.txt 설치가 실패할 때

pip install -r requirements.txt 실패는 가상환경 오류가 아니라 특정 패키지의 설치 조건 문제일 수 있습니다. wheel이 없는 패키지는 소스 배포본에서 빌드될 수 있으며, 현재 Python 버전과 운영체제에 맞는 컴파일러, 헤더, 외부 라이브러리가 필요할 수 있습니다.

우선 실패한 패키지명과 현재 Python 버전을 확인하고, 자세한 설치 로그를 봅니다.

.venv/bin/python --version .venv/bin/python -m pip install -r requirements.txt -v

--no-binary는 wheel을 사용하지 않고 소스 패키지를 사용하도록 강제합니다. 일반적인 설치 실패 해결책으로 쓰면 오히려 컴파일 요구 사항 때문에 실패할 수 있습니다. 반대로 --only-binary는 wheel이 없는 패키지를 설치하지 못하게 합니다. 두 옵션은 원인 진단이나 배포 정책에 따라 제한적으로 사용해야 합니다.

설치가 끝난 뒤 의존성 관계가 깨졌는지 확인하려면 다음 명령을 실행합니다.

.venv/bin/python -m pip check

pip check는 현재 설치된 패키지 사이의 의존성 충돌을 검사합니다. 배포 재현성이 중요한 프로젝트라면 테스트를 통과한 의존성 버전을 고정하고, 필요할 때 --require-hashes로 요구 사항 파일의 해시 검증을 적용할 수 있습니다.

시스템 Python 설치가 차단될 때

Linux 배포판이나 OS 패키지 관리자가 제공한 Python은 외부 관리 환경으로 표시될 수 있습니다. 이 경우 pip는 시스템 전역 Python의 패키지 설치·삭제를 막고 가상환경 사용을 유도합니다. 시스템 환경을 우회하기보다 프로젝트별 .venv를 만든 뒤 그 안에 설치하세요.

python3 -m venv .venv .venv/bin/python -m pip install -r requirements.txt

--break-system-packages는 외부 관리 Python의 설치 제한을 우회하도록 허용하는 옵션입니다. 프로젝트 의존성을 설치하기 위해 습관적으로 사용하면 OS 패키지 관리자와 충돌할 수 있으므로, 일반적인 개발·배포 해결책으로는 적합하지 않습니다.

가상환경 디렉터리는 Git에 커밋하지 않고, 배포 환경에서 새로 생성하는 편이 좋습니다. 프로젝트 루트의 .gitignore에는 다음처럼 추가할 수 있습니다.

.venv/

CI에서도 source activate에 의존하지 말고 가상환경 내부 Python을 직접 호출하면, 셸 종류와 PATH 상태 때문에 다른 Python이나 pip가 선택되는 문제를 줄일 수 있습니다.

python3 -m venv .venv .venv/bin/python -m pip install --upgrade pip .venv/bin/python -m pip install -r requirements.txt .venv/bin/python -m pip check

사설 패키지 인덱스를 함께 사용한다면 --extra-index-url을 무심코 추가하지 않아야 합니다. pip는 공개 인덱스와 추가 인덱스를 함께 검색할 때 의존성 혼동 문제가 생길 수 있다고 경고합니다.