[python] pip 요구 사항 파일을 사용하여 패키지를 제거하고 설치하려면 어떻게해야합니까?

개발 중에 변경되는 pip 요구 사항 파일이 있습니다.

요구 사항 파일에 나타나지 않는 패키지 pip제거 하고 나타나는 패키지 를 설치 하도록 만들 수 있습니까 ? 표준 방법이 있습니까?

이렇게하면 pip 요구 사항 파일이 패키지의 정식 목록 ( ‘if and only if’접근 방식)이 될 수 있습니다.

업데이트 : https://github.com/pypa/pip/issues/716 에서 새로운 기능으로 제안했습니다.



답변

짧은 대답은 아니오입니다. pip로는 그렇게 할 수 없습니다.


답변

requirements.txt에없는 것은 제거해야합니다.

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y

-e방법은와 함께 설치된 패키지 , 즉 git 저장소 또는 이와 유사한 패키지에서는 제대로 작동하지 않습니다 . 이를 건너 뛰려면 -e플래그로 시작하는 패키지를 필터링하면됩니다 .

pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y

그런 다음 분명히 :

pip install -r requirements.txt

2016 년 업데이트 :
위의 접근 방식을 실제로 사용하고 싶지는 않을 것입니다. 확인 pip-tools하고pip-sync 있는 당신은 아마 훨씬 더 강력한 방법으로 할 무엇을 찾고있는 달성.

https://github.com/nvie/pip-tools

2016 년 5 월 업데이트 :

이제를 사용할 수도 pip uninstall -r requirements.txt있지만 기본적으로 반대의 작업을 수행합니다.requirements.txt

2019 년 5 월 업데이트 :

pipenv를 확인하십시오 . 패키지 관리의 세계에서 이런 종류의 질문을 쓸모 없게 만드는 많은 일이 발생했습니다. 그래도 여전히 pip-tools를 사용하고 있습니다.


답변

의 기능이 pip아닙니다. 당신이 정말로 그런 일을하려는 경우의 출력을 비교하는 스크립트를 작성할 수 있습니다 pip freeze당신과를 requirements.txt하지만 가능성이 그것의 가치보다 더 많은 번거 로움이 될 것입니다.

를 사용하면 다음 virtualenv과 같이 깨끗한 환경을 만들고에서 (재) 설치하는 것이 더 쉽고 안정적입니다 requirements.txt.

deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt


답변

이제 -r requirements.txt인수를에 전달할 수 있습니다 pip uninstall.

pip uninstall -r requirements.txt -y

적어도 pip8.1.2부터 다음을 pip help uninstall표시합니다.

...
Uninstall Options:
  -r, --requirement <file>    Uninstall all the packages listed in the given requirements file.  This option can be
                              used multiple times.
...


답변

이것은 오래된 질문입니다 (하지만 좋은 질문입니다). 질문을받은 후 상황이 크게 변경되었습니다.

pip-sync다른 답변 에는 직접적인 참조가 있지만 OP의 문제를 정확하게 해결하기 때문에 자체 답변이 필요합니다.

PIP-동기화 소요 requirements.txt가 일치하도록 현재 파이썬 환경 “최대 trues”입력으로 파일 등을 정확히 점에서 무엇 requirements.txt. 여기에는 제거 하여 ENV에 존재하지만 결석있는 모든 패키지를 requirements.txt.

예 : 우리는 우리의 ENV가 (만) 3 라이브러리를 포함한다고 가정 libA, libB그리고 libC이렇게 같은 :

> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2

그러나 우리 환경에는 현재 libClibD다음이 포함됩니다 .

> pip freeze
libC==1.2
libD==1.3

pip-sync를 실행하면 원하는 최종 상태가되는 결과가 나타납니다.

> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2


답변

Stephen의 제안은 좋은 생각이지만 파일에 직접적인 요구 사항 만 포함하면 작동하지 않습니다.

를 포함하여 모든 종속성이 제거 distribute되어 pip자체적으로 분해 됩니다.

가상 환경을 추적하는 동안 깨끗한 요구 사항 파일 유지

가상 환경을 버전 추적하는 방법은 다음과 같습니다. requirements.txt직접 요구 사항 만 포함 하여 최소한의을 유지하려고 노력하고 확실하지 않은 버전 제약은 언급하지 않습니다.

하지만 그 외에도 내 virtualenv의 실제 상태를 버전 추적 (예 : git)에 유지하고 포함합니다. venv.pip 파일 합니다.

다음은 샘플 워크 플로입니다.


버전 추적을 사용하여 virtualenv 작업 공간을 설정하십시오.

mkdir /tmp/pip_uninstalling
cd /tmp/pip_uninstalling
virtualenv venv
. venv/bin/activate

버전 추적 시스템 초기화 :

git init
echo venv > .gitignore
pip freeze > venv.pip
git add .gitignore venv.pip
git commit -m "Python project with venv"

종속성이있는 패키지를 설치하고 요구 사항 파일에 포함합니다.

echo flask > requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

이제 앱 빌드를 시작한 다음 새 브랜치를 커밋하고 시작합니다.

vim myapp.py
git commit -am "Simple flask application"
git checkout -b "experiments"

추가 패키지 설치 :

echo flask-script >> requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip

… 가지고 놀다가 이전 버전으로 돌아 오세요

vim manage.py
git commit -am "Playing with flask-script"
git checkout master

이제 불필요한 패키지를 제거하십시오.

pip freeze | grep -v -f venv.pip | xargs pip uninstall -y

프로세스가 git hooks로 자동화 될 수 있다고 생각하지만 주제에서 벗어나지 말자.

물론 패키지 캐싱 시스템이나 pip2pi 와 같은 로컬 저장소를 사용하는 것이 좋습니다.


답변

@ stephen-j-fuhry를 피기 백하는 것은 내가 사용하는 powershell과 동등한 것입니다.

pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }