[python] pip 명령을 사용하여 requirements.txt에서 Python 패키지 업그레이드

pip 명령을 사용하여 requirements.txt 파일에서 모든 Python 패키지를 업그레이드하려면 어떻게해야합니까?

아래 명령으로 시도

$ pip install --upgrade -r requirements.txt

파이썬 패키지에는 버전 번호 ( Django==1.5.1) 가 접미사로 붙어 있으므로 업그레이드되지 않는 것 같습니다. requirements.txt 파일을 수동으로 편집하는 것보다 더 좋은 방법이 있습니까?

편집하다

Andy가 그의 답변에서 언급했듯이 패키지는 특정 버전에 고정되어 있으므로 pip 명령을 통해 패키지를 업그레이드 할 수 없습니다.

그러나 pip-tools다음 명령 을 사용하여 이를 달성 할 수 있습니다 .

$ pip-review --auto

그러면 requirements.txt에서 모든 패키지가 자동으로 업그레이드됩니다 ( pip-toolspip install 명령을 사용하여 설치해야 함).



답변

아니요. 요구 사항 파일이 특정 버전 에 고정 되었습니다 . 요구 사항이 해당 버전으로 설정된 경우 해당 버전 이상으로 업그레이드하지 마십시오. 업그레이드 해야하는 경우 요구 사항 파일에서 고정되지 않은 버전으로 전환해야합니다.

예:

lxml>=2.2.0

이것은 lxml을 2.2.0보다 새로운 버전으로 업그레이드합니다.

lxml>=2.2.0,<2.3.0

그러면 lxml이 2.2.0에서 2.3.0 사이의 최신 버전으로 업그레이드됩니다.


답변

당신은 시도 할 수 있습니다:

pip install --upgrade --force-reinstall -r requirements.txt

설치된 패키지를 무시하고 새 패키지를 설치할 수도 있습니다.

pip install --ignore-installed -r requirements.txt


답변

나는 이미 여기 에서이 질문에 대답했다 . 내 해결책은 다음과 같습니다.

패키지별로 패키지를 업그레이드하고 requirements.txt 파일을 업데이트하는 쉬운 방법이 없었기 때문에 선택한 패키지 (또는 모든 패키지) 파일 버전도 업데이트하는pip-upgrader 를 작성했습니다 .requirements.txt

설치

pip install pip-upgrader

용법

virtualenv를 활성화합니다 (현재 virtualenv에 업그레이드 된 패키지의 새 버전도 설치하므로 중요).

cd 프로젝트 디렉토리에 넣고 다음을 실행하십시오.

pip-upgrade

고급 사용법

요구 사항이 비표준 위치에있는 경우 인수로 보냅니다.

pip-upgrade path/to/requirements.txt

업그레이드 할 패키지를 이미 알고있는 경우 인수로 보내면됩니다.

pip-upgrade -p django -p celery -p dateutil

출시 전 / 출시 후 버전으로 업그레이드해야하는 경우 --prerelease명령 에 인수를 추가 합니다.

전체 공개 :이 패키지를 작성했습니다.


답변

예측 가능한 빌드 를 갖기 위해 모든 종속성을 동결 하는 것이 좋습니다 .

그렇게 할 때 다음과 같이 모든 종속성 을 한 번에 업데이트 할 수 있습니다 .

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

위의 일을하는 데, 테스트 패키지의 새로운 세트와 함께 프로젝트를 결국 커밋requirements.txt 저장소에 파일을.


답변

저도 똑같이해야 했어요 …이 작은 한 줄짜리 줄을 사용하여 작업을 수행했습니다.

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

어느:

  • packages=$(cat requirements.txt | sed 's/==.*//g') requirements.txt에 현재 패키지 이름 목록을 만듭니다 (버전 제거).
  • echo $packages | xargs pip3 install -U 그런 다음 모든 패키지를 인수로 pip3에 전달하여 업그레이드합니다.
  • freeze=$(pip3 freeze); requirements.txt에 필요한 형식으로 현재 패키지 버전을 모두 가져옵니다.
  • for p in $(echo $packages) 그런 다음 패키지 이름을 반복합니다.
    • echo $freeze | grep -E "^${p}==" >> requirements.new 패키지와 일치하는 pip freeze 출력에서 ​​패키지 버전 라인을 가져오고 새 requirements.txt에 기록합니다.

이는 원래 requirements.txt의 순서를 유지하는 추가 이점이 있습니다. 🙂

도움이 되었기를 바랍니다!


답변

bash를 사용하여 그렇게 할 수 없었기 때문에 버전이없는 새 요구 사항 파일을 만들고 사용하는 python 모듈을 작성했습니다.

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

그런 다음 새 파일에서 libs를 설치하십시오. pip install -U -r requirements-prod-no-version.pip

마지막으로 버전을 원본 파일로 고정 pip freeze > requirements-prod.pip


답변

또 다른 해결책은 업그레이드 요구 사항 패키지 를 사용하는 것입니다.

pip install upgrade-requirements

그런 다음 실행하십시오.

upgrade-requirements

최신 버전이 아닌 모든 패키지를 업그레이드하고 마지막에 업데이트 된 requirements.txt도 생성합니다.