162 votes

erreur d'installation de python-dev : ImportError : Aucun module nommé apt_pkg

Je suis un utilisateur Debian, et je veux installer python-dev, mais lorsque j'exécute le code dans le shell en tant que Root :

# aptitude install python-dev

Je reçois l'erreur suivante :

Traceback (most recent call last):       
  File "/usr/bin/apt-listchanges", line 28, in <module>
    import apt_pkg
ImportError: No module named apt_pkg

Quel semble être le problème et comment puis-je le résoudre ?

22voto

h4z3 Points 3738

Je vois que tout le monde dit comment le réparer avec des copies étranges etc, mais personne n'a vraiment dit pourquoi le problème se produit.

Je m'explique, pour ceux d'entre vous qui, comme moi, ne veulent pas toucher aux fichiers système uniquement parce que quelqu'un sur SO leur a dit de le faire.


Le problème est le suivant :

  • de nombreux scripts scripts ont le shebang python3 codé en dur en eux. Vous pouvez le vérifier vous-même :

    ~$ grep -R "#!/usr/bin/python3" /usr/lib/*

    /usr/lib/cnf-update-db:#!/usr/bin/python3 /usr/lib/command-not-found:#!/usr/bin/python3 /usr/lib/cups/filter/pstotiff:#!/usr/bin/python3 /usr/lib/cups/filter/rastertosag-gdi:#!/usr/bin/python3 -u grep: /usr/lib/cups/backend/cups-brf: Permission denied /usr/lib/cups/backend/hpfax:#!/usr/bin/python3 /usr/lib/language-selector/ls-dbus-backend:#!/usr/bin/python3 /usr/lib/python3/dist-packages/language_support_pkgs.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/installdriver.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/openprinting.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/xmldriverprefs.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/smburi.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/ppds.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/cupshelpers/debug.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/DistUpgrade/dist-upgrade.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/CommandNotFound/db/creator.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/CommandNotFound/db/db.py:#!/usr/bin/python3 /usr/lib/python3/dist-packages/Quirks/quirkreader.py:#!/usr/bin/python3 grep: /usr/lib/ssl/private: Permission denied /usr/lib/system-service/system-service-d:#!/usr/bin/python3 /usr/lib/ubuntu-release-upgrader/check-new-release-gtk:#!/usr/bin/python3 /usr/lib/ubuntu-release-upgrader/do-partial-upgrade:#!/usr/bin/python3 /usr/lib/ubuntu-release-upgrader/check-new-release:#!/usr/bin/python3 /usr/lib/update-notifier/package-data-downloader:#!/usr/bin/python3 /usr/lib/update-notifier/backend_helper.py:#!/usr/bin/python3 /usr/lib/update-notifier/apt_check.py:#!/usr/bin/python3 /usr/lib/update-notifier/apt-check:#!/usr/bin/python3

  • python apt package python-apt / python3-apt est un paquetage système, donc c'est pour le système par défaut python

Ainsi, les scripts obtiendront toujours la version actuellement liée à python3 mais échouent car le paquet apt n'est pas présent.


Solution générale : Ne JAMAIS changer les valeurs par défaut python3 lien. Jamais. Cela s'applique également à python lien - si une application a été écrite en Python2 avec d'anciens éléments syntaxiques qui ne fonctionnent pas en Python3, l'application ne fonctionnera pas.

(Mon terminal s'est cassé de cette façon parce que j'utilise Terminator, qui est apparemment écrit en Python2.7 non compatible avec Python3).


Les solutions présentées ici suggèrent soit de copier/lier les fichiers de paquets apt, soit de modifier les fichiers de paquets apt. python3 lien.

Analysons les deux :

  1. Copie/lien du paquet apt

Ce site ne devrait pas être un problème car à partir d'environ Python3.4, tous les scripts python fonctionnent également sur les versions plus récentes.

Jusqu'à présent. Mais il peut se briser à l'avenir - si vous gardez votre système assez longtemps.

  1. Changer python3 lien de retour

C'est une excellente solution car nous pouvons revenir à "ne jamais changer le lien".


"Mais j'aime avoir à taper juste python !" - Je l'aime aussi ! C'est comme ça que je suis arrivé à ce problème en premier lieu !

  1. En général, vous devriez éviter de changer manuellement les liens du système - utilisez update-alternatives au lieu de lier les différentes versions . Cela s'applique à toute application comportant de nombreuses versions. Cela cassera toujours les systèmes scripts (parce que cela change le lien), mais vous pouvez passer de l'un à l'autre facilement, sans vous soucier de savoir si vous avez mis link et dest dans le bon ordre ou si vous avez fait une faute de frappe.

  2. Envisagez d'utiliser un autre nom que python / python3 pour votre lien ou alias.

  3. Ou ajoutez votre propre python / python3 à PATH (comme le font les environnements virtuels), sans modifier les liens du système.

22voto

astha Points 483

Cela a fonctionné pour moi après la mise à jour de python3.7 sur ubuntu18.04.

cd /usr/lib/python3/dist-packages
sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

18voto

Hugo Sohm Points 1441

La solution de @user8178061 a bien fonctionné mais je l'ai fait avec quelques modifications pour ma version qui est python3.7 avec Ubuntu

J'ai remplacé le apt_pkg.cpython-3m-i386-linux-gnu.so avec apt_pkg.cpython-36m-x86_64-linux-gnu.so

Voici les deux commandes à exécuter :

cd /usr/lib/python3/dist-packages

sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so

16voto

Nico Points 893
  1. Vérifiez votre version de Python 3 par défaut :

    python3 --version
    Python 3.7.5
  2. cd sur /usr/lib/python3/dist-packages et vérifiez le apt_pkg.* des dossiers. Vous constaterez qu'il n'y en a pas pour votre version de Python par défaut :

    ll apt_pkg.*
    apt_pkg.cpython-36m-x86_64-linux-gnu.so
  3. Créez le lien symbolique :

    sudo ln -s apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.cpython-37m-x86_64-linux-gnu.so

8voto

Viren Patel Points 71

Si vous utilisez python 3.7, passez à python 3.6 en mettant à jour Alternatives, cela a fonctionné pour moi.

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1

sudo update-alternatives --config python3

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