Como posso atualizar pacotes específicos usando pip e um arquivo de requisitos?

436

Estou usando o pip com um arquivo de requisitos, em um virtualenv, para meus projetos do Django. Estou tentando atualizar alguns pacotes, principalmente o próprio Django, e estou recebendo um erro sobre conflitos de código-fonte:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

Isso foi depois de atualizar o número da versão do Django de 1.2.3 para 1.2.4 no meu arquivo de requisitos. Estou usando este comando para realmente fazer a atualização:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

Não consigo encontrar nenhum sinalizador que desencadeie um novo download total do pacote. Eu até tentei executar um comando de desinstalação primeiro, depois a instalação, mas sem dados. Talvez esteja faltando alguma coisa?

gcaprio
fonte
1
Por favor, verifique a resposta do @ dr-jimbob porque as versões recentes do pip realmente atualizam todas as outras dependências das quais o pacote que você está atualizando depende.
Lokesh Meher

Respostas:

61

Não tenho certeza se é exatamente o seu problema, mas no meu caso, não consegui atualizar o Django para a 1.2.4 - estava sempre terminando a versão 1.2.3, por isso desinstalei o Django com:

<virtualenv>/bin/pip uninstall Django

Em seguida, removi o <virtualenv>/build/Djangodiretório e finalmente instalei a versão adequada com:

<virtualenv>/bin/pip install Django

Espero que isso ajude.

Marcin Świerczyński
fonte
53
Esta não é a melhor prática. Use pip install Django -Uou pip install Django --upgradeconforme descrito na resposta de @JoeyG.
Ahmad
@Ahmad concorda. Deve haver um processo de atualização suave no pip e no ambiente virtual.
Parth Joshi
1270

Executei o seguinte comando e ele atualizou de 1.2.3 para 1.4.0

pip install Django --upgrade

Atalho para atualização:

pip install Django -U

Nota : se o pacote que você estiver atualizando tiver algum requisito, este comando atualizará adicionalmente todos os requisitos para as últimas versões disponíveis. Nas versões recentes do pip, você pode impedir esse comportamento especificando--upgrade-strategy only-if-needed . Com esse sinalizador, as dependências não serão atualizadas, a menos que as versões instaladas dos pacotes dependentes não atendam mais aos requisitos do pacote atualizado.

JoeyG
fonte
7
Isso para mim atualizou todos os meus tudo empacotado e totalmente bagunçado !!!! Documentos indica: - atualize todos os pacotes para a versão mais recente disponível. Isso está correto ou eu fiz algo errado?
Prometheus
4
@OrbiterFleet Eu precisava atualizar "pedidos", então fiz pip install Requests --upgradee apenas "pedidos" foram atualizados. A descrição diz "atualizar todos os pacotes especificados " quando visualizo os documentos.
harperville
31
ATENÇÃO, ele também atualiza todas as dependências e pode bagunçar tudo. a melhor opção é desinstalar e reinstalar o pacote.
Marcelosalloum
3
para atualizar o uso pacote específicopip install --upgrade django==1.4.0
whale_steward
essa deve ser a resposta correta de acordo com a pergunta ou a pergunta em si está errada.
int soumen
51

de acordo com o exemplo 3 do doc docs

pip install --upgrade django

mas com base na minha experiência, o uso desse método também atualizará qualquer pacote relacionado a ele. exemplo:

Suponha que você queira atualizar e somepackageque exija o django >= 1.2.4uso desse tipo de método, ele também atualizará somepackageE djangopara a atualização mais recente. Só para garantir, faça:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

Fazer isso atualizará somepackagee manterá o django na versão 1.2.4

whale_steward
fonte
Boa captura, mas sua explicação é confusa desde que você começou djangocomo um pacote principal e, no exemplo, usa somepackagee depois usa djangocomo dependência.
Longo
34

O comando de atalho para --upgrade:

pip install Django --upgrade

É:

pip install Django -U
Aaron Lelevier
fonte
7
Que tal editar a resposta existente para adicionar essa informação em vez de uma resposta (incompleta)?
a1an
@ a1an, sugira quais informações extras você acha que devem ser adicionadas em uma "edição sugerida". Obrigado
Aaron Lelevier
4
Quero dizer, você pode editar a resposta dada por JoeyG, adicionando a opção de atalho que você forneceu no contexto.
a1an
17

Se você atualizar um pacote, o antigo será desinstalado.

Uma maneira conveniente de fazer isso é usar esse pip-upgradeer que também atualiza as versões em seu requirements.txtarquivo para os pacotes escolhidos (ou todos os pacotes).

Instalação

pip install pip-upgrader

Uso

Ative seu virtualenv (importante, porque também instalará as novas versões dos pacotes atualizados no virtualenv atual).

cd no diretório do projeto e execute:

pip-upgrade

Uso avançado

Se os requisitos forem colocados em um local não padrão, envie-os como argumentos:

pip-upgrade path/to/requirements.txt

Se você já sabe qual pacote deseja atualizar, basta enviá-los como argumentos:

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

Se você precisar atualizar para a versão de pré-lançamento / pós-lançamento, adicione --prereleaseargumento ao seu comando.

Divulgação completa: escrevi este pacote. Espero que ajude.

Simion Agavriloaei
fonte
1
existe uma opção para atualizar todos os pacotes de uma só vez (ou seja, sem listá-los) com essa abordagem?
Bjorks número um fã
1
@MikePalmice yes: pip-upgrade -p allatualizará todos os seus pacotes e atualizará o arquivo de requisitos sem precisar de nenhuma entrada sua.
Simion Agavriloaei
15

Se você deseja atualizar apenas um pacote específico chamado somepackage, o comando que você deve usar nas versões recentes do pip é

pip install --upgrade --upgrade-strategy only-if-needed somepackage

Isso é muito útil quando você desenvolveu um aplicativo no django que atualmente funcionará apenas com uma versão específica do django (por exemplo, Django = 1.9.x) e deseja atualizar um pacote dependente com um recurso de correção de bug / novo e o pacote atualizado depende no django (mas funciona com digamos qualquer versão do django após a versão 1.5). O comportamento padrão de pip install --upgrade django-some-packageseria atualizar o django para a versão mais recente disponível, o que poderia interromper o seu aplicativo, embora os --upgrade-strategy only-if-neededpacotes dependentes agora sejam atualizados apenas conforme necessário.

dr jimbob
fonte
4

Normalmente, o pip irá limpar sozinho e remover o conteúdo do diretório de compilação. A única vez que isso não ocorre é se:

  1. Você usou a --no-installopção
  2. Você está usando pacotes editáveis
  3. A instalação foi cancelada ou foi interrompida.

Em todos os outros casos, você não deve ter um builddiretório que esteja entupindo seu ambiente.

Burhan Khalid
fonte
1

Definir uma versão específica para atualização me ajudou em vez de apenas o comando upgrade.

pip3 install larapy-installer==0.4.01 -U
Bedram Tamang
fonte
0

que resolveu para mim o problema "pip install -I --upgrade psutil --force" depois desinstale o psutil com a nova versão e espere que você possa instalar repentinamente a versão anterior (:

Eran Hpac
fonte
0

Eu uso isso:

pip3 install -r  requirements.txt  
Shahab Rahnama
fonte