web-dev-qa-db-fra.com

Ubuntu 16.04: le programme de mise à jour et le pip du logiciel ont cessé de fonctionner

Aujourd'hui, j'ai mis à niveau la bibliothèque Python matplotlib avec la commande suivante:

Sudo pip3 install --upgrade matplotlib

Tout semblait normal pendant le processus d'installation. Mais depuis lors, je rencontre deux problèmes. La première est que pip ne fonctionne plus. Chaque commande pip évoque le même message d'erreur:

    Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 7, in <module>
    from pip import main
  File "/usr/local/lib/python3.5/dist-packages/pip/__init__.py", line 26, in <module>
    from pip.utils import get_installed_distributions, get_prog
  File "/usr/local/lib/python3.5/dist-packages/pip/utils/__init__.py", line 27, in <module>
    from pip._vendor import pkg_resources
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3018, in <module>
    @_call_aside
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3004, in _call_aside
    f(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3046, in _initialize_master_working_set
    dist.activate(replace=False)
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2578, in activate
    declare_namespace(pkg)
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2152, in declare_namespace
    _handle_ns(packageName, path_item)
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2092, in _handle_ns
    _rebuild_mod_path(path, packageName, module)
  File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2121, in _rebuild_mod_path
    orig_path.sort(key=position_in_sys_path)
AttributeError: '_NamespacePath' object has no attribute 'sort

De plus, Software Updater d'Ubuntu a cessé de fonctionner. Il semble similaire à ce problème , seule la solution ne fonctionnera pas, car, bien, pip ne fonctionne pas. Mais je suppose que le problème de Software Updater disparaîtra lorsque le problème pip sera résolu.

J'ai essayé jusqu'à présent les commandes suivantes de threads avec des problèmes similaires, mais en vain

Sudo apt-get update
Sudo apt-get upgrade
Sudo apt-get -f install
Sudo apt-get install --reinstall aptdaemon
Sudo rm -rvf /var/lib/apt/lists/*
Sudo apt install --reinstall python3-pip

Et évidemment, aucune commande pip ne fonctionnera, par exemple.

Sudo pip3 install --upgrade pip setuptools wheel
pip3 install --upgrade pip
pip3 install --upgrade setuptools
3
Mr. T

J'ai trouvé, à quoi ressemblait ne réponse qui a résolu mon problème , mais c'est plutôt une méthode de sledgehammer qui n'aide pas à long terme. Supprimer un répertoire entier n’est probablement pas le moyen le plus élégant:

Sudo rm -rf /usr/local/lib/python3.5/dist-packages

Ensuite, pip n’a pas été installé, je l’ai donc réinstallé avec

Sudo apt-get update
Sudo apt-get install python3-pip 

pip était de retour et fonctionnait et le problème avec Software Updater était également résolu comme prévu. Cette "solution" fonctionne, bien qu'elle supprime de nombreuses bibliothèques telles que matplotlib, qui doivent être réinstallées par la suite. Mais lorsque j'ai réinstallé matplotlib 2.1.2, la même erreur pip a été provoquée. Je ne peux vraiment pas recommander cette approche.

tl; dr: Ne fais pas ça.

Revenons donc à la case départ. Ce qui a résolu le problème était de réinstaller pip et toutes les bibliothèques suivantes avec Sudo -H, par exemple.

Sudo -H apt install --reinstall python3-pip

Sans l'indicateur -H, une installation de matplotlib évoquait le même problème pip. Mais j'ai quand même eu le message d'erreur. La solution semble être cette modification originaire ici :

J'ai édité la ligne # 2121 ~ 2122 de ce fichier:
/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__ init__.py

#orig_path.sort(key=position_in_sys_path)
#module.__path__[:] = [_normalize_cached(p) for p in orig_path]
orig_path_t = list(orig_path)
orig_path_t.sort(key=position_in_sys_path)
module.__path__[:] = [_normalize_cached(p) for p in orig_path_t]

Ce pip/pip3 relancé et j'ai pu installer des modules. Jusqu'à présent, tout fonctionne. Espérons que ce sera le dernier.

Edit: Une semaine plus tard, le problème n’a pas refait surface, c’est pourquoi je le marque comme une réponse acceptée.

Edit 2: Une mise à jour pip a réactivé le problème. Apparemment, la mise à jour avait écrasé la modification. Ce n'était pas un problème de le réintroduire à nouveau et de se débarrasser du comportement aberrant.

1
Mr. T