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


90

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

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

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

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


3
프로그램에 필요하지 않기 때문에 pip가 임의의 패키지를 제거하고 싶습니까? 조금 위험한 것 같네요 ...
— Scott Hunter

11
@ScottHunter 사이트 패키지가없는 virtualenv를 사용하는 경우 수행하는 것이 합리적입니다.
— Michael Mior

1
@ScottHunter 예를 들어 제어 된 (가상) 환경을 사용하여 거기에 무엇이 있는지 확인하고 예상치 못한 종속성과 같은 문제를 일으킬 수있는 다른 존재는 없습니다.
— wodow

@MichaelMior 그게 답이라면 답변으로 추가해 주시면 수락하겠습니다!
— wodow

@wodow 완료. 내가 답변으로 게시하지 않은 유일한 이유는 원하는 것을 얻을 수있는 더 유용한 솔루션이 있기 때문입니다.
— Michael Mior

답변:


16

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


32
Stephen은 다음과 같이 말합니다.pip uninstall -r requirements.txt
— Ommit

31
@Ommit 요구 사항 파일에 나타나지 않는 패키지는 제거하지 않습니다. 파일에 나타나는 모든 패키지를 제거합니다.
— Michael Mior

3
@Micheal Mior, 아, 원래 질문에 충분히주의를 기울이지 않았습니다. 내 잘못이야.
— Ommit

4
-y@Ommit의 명령에 a 를 추가하여 Y를 여러 번 입력하지 않아도됩니다. 내 실수로부터 배우십시오.
— Greg Hilston

1
추가하기 만하면 : pip uninstall -r requirements.txtrequirements.txt의 버전 만 제거합니다. 당신이 제거하면 boto3==1.10.0, 예를 들어, pip freeze표시됩니다 boto3==1.0.1이전에 그것을 설치 (또는 이전 버전) 한 경우.
— Jordan Mackie

125

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를 사용하고 있습니다.


5
그것은 좋을 것입니다. 개발자가 requirements.txt를 업데이트하지 않고 수동으로 하나의 호스트에 무언가를 설치하는 경우 모든 것을 중단하여 종속성에 대해 명시 적으로 강제하는 좋은 방법 인 것 같습니다. 해당 기능을 추가하는 풀 리퀘스트가 어떤 종류의 피드백을 생성하는지보고 싶습니다.
— Stephen Fuhry 2013

이것은 정답입니다! 내에 넣고 project.config탄성 콩 줄기에 장고를위한 파일 : 05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y". 이제 .NET에서 주석을 사용하여 환경을 재 구축하지 않고도 pip 패키지를 롤백 할 수 있습니다 requirements.txt. 이것은 저에게 실시간 다운 타임을 줄여줍니다. 감사합니다!
— e.thompsy

#으로 시작하는 pip freeze의 출력이 있습니까? 즉, 두 번째 grep이 필요합니까?
— xor

1
pip freeze댓글을 작성 했는지 확실하지 않지만 언젠가는 API에 추가 할 수 있으며 댓글이 있으면 유효합니다. 그렇지 않은 경우 위의 내용은 작동하지 않습니다. 대시를 사용하면 이전 명령의 stdin을 사용할 수 있습니다.이 경우 대시는 requirements.txt의 내용을 다음의 출력과 비교하도록 grep에 지시합니다 pip freeze( pip freeze이 컨텍스트 의 출력은 stdin과 동의어 임)
— Stephen Fuhry

1
pip-tools를 적극 권장합니다. +1
— ron rothman

16

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

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

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

6
일부 패키지 (PIL, lxml 등)에 긴 컴파일이 필요한 경우 요구 사항 파일에없는 패키지를 제거하는 것이 유용 할 수 있습니다. 특히 가상 환경을 사용하는 라이브 서버에서 수행되는 경우에는 더욱 그렇습니다.
— melinath

@melinath 요구 사항 파일에없고 이미 설치되어있는 경우 컴파일을 다시 수행 할 필요가 없습니다.
— Michael Mior 2014 년

1
@MichaelMior-이 답변에서 알 수 있듯이 전체 virtualenv를 지우지 않는 한.
— melinath

1
@melinath 그러나 virtualenv를 지우고 패키지가 필요하지 않은 경우 (그리고에서가 아니라 requirements.txt) 왜 다시 설치됩니까?
— Michael Mior 2014 년

3
@MichaelMior 나는 내 원래 코멘트를 좀 더 명시 적으로 언급 할 것이다. 내가 말한 요점을 오해 한 것 같습니다. PIL 및 lxml이 포함 된 간단한 요구 사항 파일을 상상해보십시오. 그러나 그런 다음 lxml이 더 이상 필요하지 않다고 결정하고 요구 사항 파일에서 제거합니다. 이 답변이 제안한대로 수행하고 virtualenv를 지우면 PIL을 다시 설치 (및 다시 컴파일)해야합니다. lxml (즉, 요구 사항 파일에없는 모든 패키지)을 제거하는 옵션을 갖는 것이 더 효율적일 것입니다.
— melinath

11

이제 -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.
...

3
파일에 표시되지 않는 패키지는 제거되지 않습니다. 이 패키지를 제거 할 파일에 표시합니다.
— Michael Mior

4

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

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

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

> 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

전 세계적으로 설치된 pip-tools가 있다면 현재 활성화 된 virtualenv에서 제거되지 않을 것입니다 ... 여전히 이상하지만 그렇지 않으면 내가 아는 가장 간단한 요구 사항 관리 도구입니다.
— benzkji

3

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 와 같은 로컬 저장소를 사용하는 것이 좋습니다.


2

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

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

0

이것이 질문에 직접 답하는 것은 아니지만 requirements.txt지금 보다 더 나은 대안 은 Pipfile. 이것은 Ruby와 유사하게 작동 Gemfile합니다. 현재이 pipenv도구를 사용해야 하지만 결국이 도구가 pip. 이것은 제공합니다pipenv clean 원하는 것을 수행하는 명령을 .

(참고 기존 가져올 수 requirements.txt와를 pipenv install -r requirements.txt.이 후에는이 있어야 Pipfile하고는 requirements.txt제거 할 수 있습니다.)


-3

이제 다음을 사용할 수 있습니다.

pip uninstall -r requirements.txt

2
요구 사항 파일에 나타나지 않는 패키지는 제거되지 않습니다. 그것은 모든 패키지를 제거 할 파일에 표시합니다.
— Michael Mior
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.