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

그러나 우리 환경에는 현재 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

전 세계적으로 설치된 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.