특정 버전이 필요해 기존 패키지를 지우려는데 pip uninstall 이 거부한다.
Cannot uninstall blinker 1.7.0, RECORD file not found.
Hint: The package was installed by debian.
RECORD 대신 Hint: The package was installed by rpm. 이 나오기도 한다.
pip 는 자기가 설치한 파일 목록을 dist-info/RECORD 에 적어 두고, 삭제할 때 그 목록대로 지운다. 반면 apt 나 dnf 로 설치된 파이썬 패키지는 파일 목록을 배포판 패키지 데이터베이스가 들고 있고 RECORD 를 만들지 않는다.
그래서 pip 입장에서는 무엇을 지워야 하는지 알 수 없는 상태다. 억지로 지우면 배포판 패키지 데이터베이스와 실제 파일이 어긋나 이후 apt · dnf 동작이 꼬인다. 오류가 아니라 보호 장치다.
먼저 그 모듈이 실제로 어디에서 왔는지 본다.
python3 -c "import blinker, os; print(os.path.dirname(blinker.__file__))"
Debian · Ubuntu 계열:
dpkg -S /usr/lib/python3/dist-packages/blinker
apt list --installed 2>/dev/null | grep -i blinker
RHEL 계열:
rpm -qf /usr/lib/python3.9/site-packages/blinker
배포판 패키지 이름은 보통 python3-<모듈명> 형태다.
시스템 파이썬의 패키지를 건드리는 것은 마지막 수단이다. apt · dnf 자체와 여러 시스템 도구가 그 런타임을 함께 쓰기 때문에, 버전을 바꾸면 무관해 보이는 도구가 깨진다.
python3 -m venv ~/venvs/work
source ~/venvs/work/bin/activate
pip install 'blinker==1.7.0'
기본 가상환경은 시스템 패키지를 보지 않으므로, 시스템에 어떤 버전이 있든 영향을 받지 않는다. 반대로 시스템 패키지를 같이 보게 만든 가상환경(--system-site-packages)에서는 같은 문제가 그대로 재현된다.
배포판 패키지를 배포판 도구로 지우고, 그다음 pip 로 설치한다. 순서를 지켜야 데이터베이스가 어긋나지 않는다.
sudo apt remove python3-blinker
pip install --user 'blinker==1.7.0'
지우기 전에 무엇이 딸려 나가는지 반드시 확인한다. 파이썬 라이브러리 패키지는 다른 시스템 도구의 의존성인 경우가 많아, 한 줄 제거가 데스크톱 환경이나 패키지 관리자 도구를 함께 끌고 나가기도 한다.
apt -s remove python3-blinker
-s 는 모의 실행이다. 제거 목록에 예상치 못한 것이 들어 있으면 중단하고 가상환경으로 돌아간다.
pip install --ignore-installed 로 덮어쓰기 — 파일은 덮이지만 배포판 데이터베이스에는 옛 버전이 그대로 남는다. 이후 배포판 업데이트가 파일을 되돌려 놓아 원인을 찾기 어려운 버전 되돌림이 생긴다.dist-info 디렉터리를 손으로 만들어 pip 를 속이기 — 같은 이유로 상태만 더 나빠진다.sudo pip install 로 시스템에 직접 설치 — 최근 배포판은 PEP 668 로 이것을 막고 있다. 그 오류와 이 오류는 원인이 다르므로 섞어 보지 않는다.