web-dev-qa-db-fra.com

ModuleNotFoundError dans les traces avec Python3.6 sur linux

I installé Python 3.6 sur Ubuntu 16.04 en utilisant PPA de Jonathon Fernyhough :

Sudo add-apt-repository ppa:jonathonf/python-3.6
Sudo apt-get update
Sudo apt-get install python3.6

J'ai créé une chaîne en utilisant la nouvelle interpolation de chaîne littérale, mais j'ai fourni un spécificateur de format non valide. J'ai non seulement obtenu le ValueError: Invalid format specifier Attendu, mais aussi l'inattendu ModuleNotFoundError: No module named 'apt_pkg'.

$ python3.6
Python 3.6.0 (default, Dec 29 2016, 21:40:36) 
[GCC 5.4.1 20161202] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> value = 4 * 20
>>> f'the value is {value:%A}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier

Je l'ai signalé au Python bug tracker . Là, il a été noté que:

Il semble que ce soit le problème du fournisseur, pas CPython lui-même. Ce même problème se produit également dans Python 3.6 d'Ubuntu 16.10. Le déclenchement d'une exception peut provoquer ceci:

Python 3.6.0b2 (default, Oct 11 2016, 05:27:10) 
[GCC 6.2.0 20161005] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> raise Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception
>>> 

Voir également https://bugs.launchpad.net/ubuntu/+source/python3.6/+bug/1631367 .

Enfin, le problème a été clos avec le commentaire

Oui, cela semble être l'infrastructure de signalement des défaillances du fournisseur qui échoue. Pourquoi ils voudraient un rapport pour chaque traceback à l'invite interactive est au-delà de moi, mais cela semble être ce qu'ils essaient de faire.

Mes questions sont maintenant:

  1. Comment interpréter ce commentaire? Le vendeur est-il dans ce cas le PPA de Jonathon Fernyhough? Et a-t-il changé quelque chose pour le code Python qu'il distribue afin qu'il essaie de déposer un rapport pour chaque exception qui produit un retraçage?
  2. Qui dois-je notifier ou où dois-je déposer un bug pour résoudre ce problème?
12
BioGeek

Après avoir posté cette question sur Stackoverflow, Barry A. Varsovie a fait ce qui suit commentaire au suivi des problèmes

Veuillez comprendre que l'installation de Python 3.6 à partir d'un PPA aléatoire ne pas fournit un support complet pour cette version de l'interpréteur. = Python 3.6 n'est pas encore une version prise en charge dans aucune version d'Ubuntu (que je suppose que vous utilisez), bien que nous y travaillions pour le 17.04.

Très souvent, vous pouvez installer un nouveau package d'interpréteur Python 3 et bien des choses fonctionneront car l'infrastructure Ubuntu partage des modules Python purs sur tous les Python 3) installés. Techniquement parlant, ils auront tous/usr/lib/python3/dist-packages sur leur sys.path donc tout module tiers pur Python construit pour une version de support de Python 3 sera importable par n'importe quelle version (intégrée au package) de Python 3.

Mais cela 1) est loin de dire que ces modules tiers fonctionneront; 2) n'inclut aucun paquet contenant des modules d'extension C, qui doivent être reconstruits pour la version d'interpréteur spécifique.

Prise en charge d'une nouvelle version de Python est un long processus, pour lequel nous venons de commencer. Veuillez vous engager avec [email protected] pour plus de détails.

Ubuntu installe un gestionnaire d'exceptions standard afin que lorsque Python et ces plantages, nous pouvons collecter des statistiques de plantage, afin que nous puissions consacrer des ressources à la résolution des problèmes et régressions courants. le traceback) est cette infrastructure de rapport d'incident. alloc appelle apt_pkg, qui est un module d'extension (C++) et ne sera donc pas construit pour la version de Python 3.6 que vous avez installée à partir de ce PPA, à moins bien sûr que le propriétaire du PPA (que je ne connais pas) ait également fait une reconstruction à l'échelle de l'archive Python 3. Comme je suis en train de le configurer, et je sais que c'est pas mal de travail, je doute que cela ait été fait pour ce PPA plutôt aléatoire.

La liste de diffusion ubuntu-devel est un meilleur endroit pour discuter du travail en cours pour apporter Python 3.6 en tant que version prise en charge sur Ubuntu.

13
BioGeek

J'ai résolu ce problème pour Python 3.6 en installant d'abord le package python-apt pour Python 3:

Sudo apt install python3-apt

Après cela, j'ai changé pour le dist-packages répertoire et copié le apt_pkg[...].so fichier avec le nouveau nom de fichier par défaut apt_pkg.so, pour être également reconnu par Python 3.6:

cd /usr/lib/python3/dist-packages
Sudo cp apt_pkg.cpython-34m-i386-linux-gnu.so apt_pkg.so

Maintenant tout ModuleNotFoundError: No module named 'apt_pkg' les exceptions ont disparu sur les messages d'erreur attendus.

26
andreas

Si la réponse la plus votée ne fonctionne pas pour vous, veuillez essayer les étapes ci-dessous (Gardez à l'esprit que vous devez changer [version]):

  1. exécutez cette commande Sudo apt install python3-apt
  2. allez dans le répertoire cd /usr/lib/python3/dist-packages
  3. exécutez ls pour trouver la version correcte de apt_pkg.cpython-[version]-i386-linux-gnu.so dans mon cas c'était 35m
  4. créer un lien symbolique Sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so N'OUBLIEZ PAS: tapez votre [version]

Dépannage

Si vous obtenez une erreur cp: cannot stat 'apt_pkg.cpython-[your-version]-i386-linux-gnu.so': No such file or directory essayez les commandes ci-dessous:

  1. rm -rf apt_pkg.so
  2. créer un lien symbolique Sudo cp apt_pkg.cpython-[version]-i386-linux-gnu.so apt_pkg.so N'OUBLIEZ PAS: tapez votre [version]