63 votes

pip 10 et apt: comment éviter les erreurs "Impossible de désinstaller X" pour les packages distutils

Je fais affaire avec un héritage Dockerfile. Voici une très simplifié version de ce que je fais:

FROM ubuntu:14.04

RUN apt-get -y update && apt-get -y install \
    python-pip \
    python-numpy # ...and many other packages

RUN pip install -U pip

RUN pip install -r /tmp/requirements1.txt # includes e.g., numpy==1.13.0
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt

Tout d'abord, plusieurs paquets sont installés à l'aide de apt, puis plusieurs paquets sont installés à l'aide de pip. pip version 10 a été publié, et le cadre de la publication est cette nouvelle restriction:

Supprimé le support pour la désinstallation de projets qui ont été installés à l'aide de distutils. distutils projets installés ne pas inclure les métadonnées indiquant quels fichiers appartiennent à installer et il est donc impossible de désinstaller, plutôt que de simplement supprimer les métadonnées en disant qu'ils ont été installés tout en laissant tous les fichiers réels derrière.

Cela conduit au problème suivant lors de mon installation. Par exemple, la première apt installe python-numpy. Plus tard, pip tente d'installer une version plus récente d' numpy de par exemple, /tmp/requirements1.txt, et tente de désinstaller l'ancienne version, mais en raison de la nouvelle restriction, il ne peut pas supprimer cette version:

Installing collected packages: numpy
  Found existing installation: numpy 1.8.2
Cannot uninstall 'numpy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

Maintenant, je sais à quel point il y a plusieurs solutions.

Je ne pouvais pas installer python-numpy par apt. Toutefois, cela provoque des problèmes, car python-numpy installe un peu différents forfaits sont les exigences, et je ne sais pas si une autre partie du système qui s'appuie sur ces paquets. Et en réalité, il existe plusieurs apt packages installés à travers le Dockerfile, et chacun, j'supprimer l'impression de découvrir un autre Cannot uninstall X d'erreur, et en retire un certain nombre d'autres paquets avec elle, que notre application peut ou ne peut pas compter sur.

J'ai pu également utiliser l' --ignore-installed option lorsque j'essaie d' pip installer des choses qui ont déjà été installés par apt, mais là encore j'ai le même problème de tous les --ignore-installed argument révélant encore une autre chose qui doit être ignoré.

Je pourrais broche pip à une ancienne version qui n'a pas cette restriction, mais je ne veux pas être coincé à l'aide d'une version obsolète de pip jamais.

J'ai tourné en rond en essayant de trouver une bonne solution qui implique un minimum de changements de cet héritage Dockerfile, et permet à l'application nous déployer avec ce fichier de continuer à fonctionner comme il l'a été. Des suggestions quant à la façon dont je peux contourner ce problème de la pip 10 ne pas être en mesure d'installer des versions plus récentes de l' distutils forfaits? Merci!!!!

Mise à JOUR:

Je ne savais pas que l' --ignore-installed pourrait être utilisé sans un package comme un argument pour ignorer tous les paquets installés. Je suis d'examiner si oui ou non cela peut être une bonne option pour moi, et ont demandé à ce sujet ici.

115voto

elethan Points 6867

C'est la solution que j'ai fini par aller avec, et nos applications ont été en cours d'exécution en production sans problèmes pendant près d'un mois avec ce correctif en place:

Tout ce que je n'avais plus qu'à ajouter

--ignore-installed

à l' pip install lignes dans mon dockerfile qui ont été la levée des erreurs. En utilisant la même dockerfile exemple de ma question initiale, le fixe dockerfile ressemblerait à quelque chose comme:

FROM ubuntu:14.04

RUN apt-get -y update && apt-get -y install \
    python-pip \
    python-numpy # ...and many other packages

RUN pip install -U pip

RUN pip install -r /tmp/requirements1.txt --ignore-installed # don't try to uninstall existing packages, e.g., numpy
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt

La documentation que j'ai pu trouver pour l' --ignore-installed n'était pas clair dans mon opinion (pip install --help simplement dit "Ignorer les paquets installés (réinstallation de la place)."), et j'ai demandé sur les dangers potentiels de ce drapeau ici, mais n'ont pas encore obtenir de réponse satisfaisante. Cependant, si il y a des effets secondaires négatifs, notre environnement de production n'a pas encore vu les effets d'entre eux, et je pense que le risque est faible/aucune (à moins que notre expérience). J'ai été en mesure de confirmer que, dans notre cas, lorsque cet indicateur a été utilisé, l'installation existante n'a pas été désinstallé, mais que la nouvelle installation a toujours été utilisé.

Mise à jour:

Je tenais à souligner cette réponse par @ivan_pozdeev. Il fournit de l'information, que cette réponse ne comprennent pas, et il décrit également certains des effets secondaires potentiels de la solution.

13voto

Archie Jain Points 61

C'est ce qui a fonctionné pour moi--

 pip install --ignore-installed <Your package name>
 

ou

 sudo pip install --ignore-installed <Your package name>
 

ou (à l'intérieur du carnet jupyter)

 import sys
!{sys.executable} -m pip install --ignore-installed <Your package name>
 

2voto

Prasann Barot Points 301

Pour les fenêtres, écrivez

conda update --all pip install --upgrade <Your package name>

OU

conda update --all pip install <Your package name>

OU

pip install wrapt --upgrade --ignore-installed pip install <Your package name>

à partir d' ERREUR: impossible de désinstaller 'wrapt'. pendant la mise à niveau

0voto

Moharnab Saikia Points 179

Vous pouvez simplement supprimer numpy manuellement mais garder les autres dépendances installées par apt. Utilisez ensuite pip comme précédemment pour installer la dernière version de numpy.

 #Manually remove just numpy installed by distutils
RUN rm /usr/lib/python2.7/dist-packages/numpy-1.8.2.egg-info
RUN rm -r /usr/lib/python2.7/dist-packages/numpy

RUN pip install -U pip
RUN pip install -r /tmp/requirements1.txt
 

L'emplacement de numpy doit être le même. Mais si vous souhaitez confirmer l'emplacement, vous pouvez exécuter le conteneur sans exécuter les fichiers requirements.txt et émettre les commandes suivantes dans la console python à l'intérieur du conteneur.

 >>> import numpy
>>> print numpy.__file__
/usr/lib/python2.7/dist-packages/numpy/__init__.pyc
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X