폐쇄망에 패키지를 반입하기 전에 그 패키지가 무엇을 끌고 오는지 알아야 한다. 설치해 보지 않고, 또는 이미 설치한 환경에서 의존 관계를 확인하는 방법이 필요하다.
가장 가벼운 것은 pip show 다. 바로 아래 단계만 보여 준다.
pip show pandas
# Requires: numpy, python-dateutil, pytz, tzdata
# Required-by: seaborn
Requires 는 이 패키지가 필요로 하는 것, Required-by 는 이 패키지를 필요로 하는 것이다. 지우기 전에 후자를 확인하지 않으면 다른 패키지를 망가뜨린다.
전체 트리를 보려면 pipdeptree 를 쓴다.
pip install pipdeptree
pipdeptree # 전체 트리
pipdeptree -p pandas # 특정 패키지에서 아래로
pipdeptree -r -p numpy # 거꾸로, 누가 numpy 를 쓰는지
pipdeptree --warn fail # 충돌이 있으면 종료 코드로 알림
pipdeptree --json-tree > deps.json
pipdeptree 는 버전 충돌도 잡아 준다. 설치는 됐는데 요구 범위를 벗어난 조합을 쓰고 있으면 경고로 나온다. 같은 검사를 pip 자체로도 할 수 있다.
pip check
johnnydep 는 저장소의 메타데이터만 읽어 트리를 만든다. 반입 목록을 뽑을 때 유용하다.
pip install johnnydep
johnnydep pandas
johnnydep 'pandas==2.2.2' --output-format pinned
pip 의 예행 연습으로도 같은 목적을 이룰 수 있다. 실제 설치 없이 해결 결과만 받는다.
pip install --dry-run --report report.json pandas
python -m json.tool report.json | grep '"name"'
--report 는 pip 22.2 이상에서 쓸 수 있다. 결과 JSON 에는 해결된 각 배포본의 이름·버전·내려받을 URL 이 들어 있어 그대로 반입 목록이 된다.
파일만 모을 목적이라면 애초에 pip download 가 맞다. 의존성을 모두 따라가며 휠을 모은다.
pip download -d ./wheelhouse pandas
ls ./wheelhouse
이미 설치된 환경에서 표준 라이브러리만으로 보려면 다음과 같다.
from importlib.metadata import requires, distribution
print(requires("pandas"))
print(distribution("pandas").metadata["Requires-Dist"])
내려받은 휠 파일 하나를 열어 볼 수도 있다. 휠은 zip 이다.
unzip -p pandas-2.2.2-cp311-cp311-manylinux_x86_64.whl '*/METADATA' | grep '^Requires-Dist'
의존성은 환경에 따라 달라진다. Requires-Dist 에는 ; python_version < "3.11" 이나 ; extra == "plot" 같은 조건이 붙는다. 대상 파이썬 버전과 OS 에서 해석해야 실제 목록이 나온다. 개발자 노트북에서 뽑은 목록을 그대로 서버에 반입하면 모자라거나 남는다.
선택적 추가 기능(extras)은 기본 설치에 포함되지 않는다. pandas[excel] 처럼 대괄호로 지정한 것까지 포함해 조회해야 한다.
pandas_profiling 처럼 이름이 바뀐 패키지가 있다. 이 패키지는 ydata-profiling 으로 개명했고 옛 이름은 더 이상 갱신되지 않는다. 옛 이름으로 의존성을 조회하면 낡은 목록을 얻는다.
빌드 의존성은 런타임 의존성과 다르다. 소스 배포본에서 설치할 때 컴파일러나 헤더가 필요한 경우는 위 도구로 드러나지 않는다.