설치 경로를 옮기려고 --target 만 주었는데 다음 오류가 난다.
ERROR: Can not combine '--user' and '--target'
--user 는 적은 적이 없다.
pip 은 명령줄에 없는 옵션도 세 곳에서 끌어온다. 우선순위는 명령줄 · 환경변수 · 설정 파일 순이고, 뒤의 둘이 --user 를 켜 두었으면 명령줄에 안 적어도 켜진 것으로 동작한다.
첫째, 환경변수다. pip 은 PIP_<옵션이름> 규칙으로 모든 옵션을 환경변수에서 읽는다.
env | grep -i '^PIP_'
# PIP_USER=1 이 잡히면 이것이 원인이다
둘째, 설정 파일이다. 시스템 · 사용자 · 사이트 세 단계가 있다.
pip config list
pip config debug
/etc/pip.conf
~/.config/pip/pip.conf # 리눅스
%APPDATA%\pip\pip.ini # 윈도우
[install]
user = true
셋째, 배포판이 손을 댄 경우다. 데비안·우분투 계열은 시스템 파이썬을 보호하려고 pip 의 기본을 --user 로 바꿔 놓는 패치를 넣은 적이 있다. 컨테이너 이미지 제작자가 PIP_USER=1 을 박아 두는 경우도 흔하다.
명령줄 옵션이 가장 세므로 그 자리에서 되돌린다.
pip install --no-user --target=/opt/libs <패키지>
환경변수를 그 명령에서만 비워도 된다.
PIP_USER=0 pip install --target=/opt/libs <패키지>
영구적으로 바꾸려면 설정 파일 항목을 지운다.
pip config unset install.user
--target 은 "그 디렉터리 안에 패키지를 그대로 푼다"는 뜻이다. 가상환경 설치와 다르다.
해당 디렉터리는 자동으로 검색 경로에 들어가지 않으므로 PYTHONPATH 에 넣거나 코드에서 sys.path 에 추가해야 한다.
export PYTHONPATH=/opt/libs:$PYTHONPATH
--target 은 기존 파일을 덮어쓰며, 같은 디렉터리에 버전이 다른 패키지를 두 번 설치하면 파일이 섞인다. 깨끗이 다시 만들려면 디렉터리를 지우고 설치한다. 의존성이 있는 콘솔 스크립트는 bin/ 이 아니라 대상 디렉터리 안에 생기므로 그대로는 실행되지 않는다.
폐쇄망에 반입할 파일만 모으는 것이 목적이라면 --target 보다 pip download 가 맞다.
pip download -d ./wheelhouse -r requirements.txt
| 목적 | 쓰는 것 |
|---|---|
| 프로젝트별 격리 | python -m venv |
| 내 계정에만 설치 | --user |
| 특정 디렉터리로 통째 배포 | --target |
| 파일만 받아 옮기기 | pip download |
시스템 파이썬에 직접 설치하는 것은 배포판 패키지와 충돌하므로 피한다. 최근 배포판은 아예 externally-managed-environment 오류로 막는다.