패키지 관리자를 통하지 않고 패키지를 설치하는 것은 매우 나쁜 생각이라고 들었기 때문에 pip
를 통해 설치한 모든 패키지를 찾아보았습니다. 패키지는 pip
의 공식 저장소에서도 쉽게 찾을 수 있습니다. 모든 패키지가 이와 같은 것은 아닙니다(AUR을 탐색하거나 직접 패키지할 수 있다는 것을 알고 있지만 지금은 공식 저장소에 머물려고 노력하고 있습니다). 따라서 pacman
일부 패키지는 현재 설치된 상태로 유지하고 나머지는 .pip
pacman
이 작업을 수행하기 위한 내(인정적으로 원시적인) 작업 흐름은 다음과 같습니다.
pip freeze | less
;마이그레이션할 패키지 선택(기본적으로 임의)pacman -Ss python-packagename
(찾을 수 없으면 중단하고 다른 패키지로 다시 시도하세요)sudo pip uninstall packagename
sudo pacman -S python-packagename
pacman
파일 충돌이 보고되면 모든 종속 패키지에 대해 2~4단계를 반복한 다음 대상 패키지에서 5단계를 다시 시도합니다 .
pacman
이제 올바른 파일을 표시하는 -list를 통해 패키지를 성공적으로 관리했다고 생각하며 , 흥미롭게도 pacman -Ql python-packagename
패키지가 업데이트되어 패키지 업데이트 책임을 맡았음을 나타냅니다.pacman
pacman
그러나 문제는 pip freeze
이러한 패키지가 pip
.
예를 들어, 및 pip freeze | grep pylint
둘 다 pacman -Qqe | grep pylint
패키지가 설치되었음을 나타냅니다. sudo pacman -Rs python-pylint
또는 를 통해 패키지를 성공적으로 제거 할 수 있습니다 sudo pip uninstall pylint
.
이렇게 하면 - 패키지를 제거합니다.합격이든 pip
합격이든pacman
- 패키지가 pip freeze
목록에서 사라지고 pacman -Qqe
더 이상 아무것도 찾을 수 없습니다. 그런 다음 패키지를 다시 설치하면 pacman -S
다시 나타납니다 pip freeze
. 패키지를 다시 설치하면 pip
해당 패키지가 pacman -Qqe
.
pip
패키지를 실행하여 제거한 sudo pip uninstall packagename
다음 --user
플래그(예: pip install --user packagename
) 를 사용하여 다시 설치하면 sudo pip freeze
패키지가 표시되지 않지만 pip freeze
계속 표시됩니다. 패키지를 다시 설치하면 pacman
두 목록 모두에 다시 나타납니다.
이 질문이 이전 질문과 중복된 것 같지 않습니다.이 링크에서;이 문제에서는 사용자가 제거를 통해 패키지를 제거할 수 없었 pip freeze
으며 문제는 여러 다른 pip
바이너리로 추적되었습니다.
이 경우 패키지를 제거하면 패키지 pip
도 제거되고 pip freeze
동일한 출력이 which pip
표시됩니다 . 또한 동일한 출력을 생성합니다 .sudo which pip
/usr/bin/pip
sudo pip freeze
pip freeze
그러나 위에 링크된 질문에 대한 답변에 제시된 테스트는 제가 생각하기에 이상한 동작을 보여줍니다. (다음 테스트는 제거 및 재설치를 pylint
통해 진행되었습니다 .)pip
pacman
$ python -c 'import pkg_name' &> /dev/null && echo installed || echo not installed
Using config file /home/[my user name]/.pylintrc
not installed
패키지가 실제로 설치되었습니다. 구성 파일 줄을 인쇄할 뿐만 아니라 패키지를 정상적으로 사용할 수 있습니다( pylint foo.py
). 테스트를 인쇄하고 싶지 않습니까 installed
?
주제에 대한 실제 질문에 대답하려면 다음을 수행하십시오.
pip
실제로 어떤 패키지가 및를 통해서만 설치되고 어떤 패키지가 및를 통해 "설치" 되는지 확인하려면 어떻게 해야 합니까 ?pip
pacman
pip
설치를 통해 패키지를 추적하는 광범위한 문제를 해결하려면 어떻게 해야 합니까pacman
?
답변1
저는 Python 스크립트를 작성했습니다(글머리기호 링크) 모든 Python 패키지에 pacman
.
설치하다
스크립트를 다운로드하고 실행 가능하게 만듭니다.
$ wget https://gist.github.com/hoefling/314565368a66c308b4d7d407a3028cb7/raw/7b81553fa0a84b92a90fbaa0746482d0ec18516c/pip-query -O pip-query
$ chmod +x pip-query
용법
base/archlinux
다음은 내가 설치한 Docker 컨테이너에서 이를 호출하는 예입니다 python-pip
.python-wheel
$ ./pip-query
Package Version Owner
---------- ------- -----------------
appdirs 1.4.3 python-appdirs
packaging 17.1 python-packaging
pip 9.0.1 python-pip
pyparsing 2.2.0 python-pyparsing
setuptools 39.2.0 python-setuptools
six 1.11.0 python-six
wheel 0.31.1 python-wheel
출력은 의 출력과 유사 pip list --format=columns
하지만 Owner
Python 패키지를 소유하는 시스템 패키지의 이름을 인쇄하는 추가 열이 있습니다.
직접 설치된 패키지를 사용하여 테스트해 보겠습니다 pip
.
$ sudo pip install tqdm
...
$ ./pip-query
Package Version Owner
---------- ------- -----------------
appdirs 1.4.3 python-appdirs
packaging 17.1 python-packaging
pip 9.0.1 python-pip
pyparsing 2.2.0 python-pyparsing
setuptools 39.2.0 python-setuptools
six 1.11.0 python-six
tqdm 4.23.4
wheel 0.31.1 python-wheel
이 열의 Owner
행에 빈 셀이 있는데 이는 설치되지 않았 tqdm
음을 나타냅니다 . 제거 :tqdm
pacman
tqdm
pip
$ sudo pip uninstall -y tqdm
그것을 설치하십시오 pacman
:
$ pacman -S python-tqdm
영구 설치
원하는 경우 적절한 실행 파일이라고 부르는 것처럼 pip-query
파일을 PATH
, 바람직하게는 로컬 에 넣으십시오.$HOME/.local/bin
$ pip-query
다른 패키지 관리자에 적응
원하는 경우 다른 패키지 관리자와 함께 작동하도록 스크립트를 쉽게 조정할 수 있습니다. 예를 들어, ['pacman', '-Qqo', file]
로 변경하면 ['qfile', '-q', file]
스크립트는 추가 수정 없이 젠투에서 실행됩니다*. 패키지 관리자가 일반 패키지 이름 인쇄를 지원하지 않는 경우 out
정규식이나 다른 방법을 사용하여 문자열에서 관련 정보를 추출하십시오.
일괄 재설치 패키지pacman
이를 수정 pip-query
하거나 Unix 철학을 따르고 bash 명령을 작성하여 다시 설치할 수 있습니다. 그러나 pacman
아래 예와 같이 여러 가지 권장 사항을 처리하고 권장 사항 없이 상황을 구현해야 합니다. 내 시도는 다음과 같습니다(bash 전문가는 아님).
$ ./pip-query | tail -n +3 | while read line ; do split=(${line}); \
> if [ "${#split[@]}" -eq "2" ]; then pkgname=${split[0]}; \
> echo -e "Suggestion: pip uninstall -y $pkgname && pacman -S $(pacman -Sspq $pkgname | tr '\n' ' ')"; \
> fi; done
Suggestion: pip uninstall -y tqdm && pacman -S python-tqdm python2-tqdm
이를 강화하면 재설치 작업을 위한 자동화된 솔루션을 갖게 됩니다.
*: 가정적인 app-portage/portage-utils
발생.