351 votes

Quelle est l'erreur du mauvais chiffre magique ?

Qu'est-ce que l'erreur ImportError "Bad magic number" en python, et comment la corriger ?

La seule chose que j'ai pu trouver en ligne suggère que cela est dû à la compilation d'un fichier .py -> .pyc et à la tentative de l'utiliser avec la mauvaise version de python. Dans mon cas, cependant, le fichier semble s'importer correctement à certains moments mais pas à d'autres, et je ne sais pas pourquoi.

Les informations fournies par python dans le traceback ne sont pas particulièrement utiles (c'est pourquoi je posais la question ici...), mais les voici au cas où elles seraient utiles :

Traceback (most recent call last):
  File "run.py", line 7, in <module>
    from Normalization import Normalizer

0 votes

Pourriez-vous fournir le code dans lequel le problème se produit ?

0 votes

Et quelle version de python utilisez-vous ?

0 votes

Et la normalisation est-elle un de vos fichiers ou un fichier tiers ?

456voto

paxdiablo Points 341644

Le nombre magique provient des systèmes de type UNIX où les premiers octets d'un fichier contenaient un marqueur indiquant le type de fichier.

Python place un marqueur similaire dans son fichier pyc lorsqu'il les crée.

L'interpréteur python s'assure ensuite que ce nombre est correct lors de son chargement.

Tout ce qui porte atteinte à ce nombre magique causera votre problème. Cela inclut l'édition du pyc ou en essayant d'exécuter un pyc à partir d'une version de python différente (généralement plus récente) que votre interpréteur.

S'ils sont votre pyc il suffit de les supprimer et de laisser l'interpréteur recompiler le fichier py fichiers. Sur les systèmes de type UNIX, cela peut être quelque chose d'aussi simple que :

rm *.pyc

ou :

find . -name '*.pyc' -delete

Si ce ne sont pas les vôtres, vous devrez soit vous procurer la py pour une recompilation, ou un interpréteur qui peut exécuter le fichier pyc avec cette valeur magique particulière.

Une chose qui pourrait être la cause de la nature intermittente. Le site pyc qui cause le problème ne peut être importé que dans certaines conditions. Il est très peu probable qu'il soit importé parfois. Vous devriez vérifier la trace complète de la pile lorsque l'importation échoue ?

Soit dit en passant, le premier mot de tous mes 2.5.1(r251:54863) pyc Les fichiers sont 62131 , 2.6.1(r261:67517) es 62161 . La liste de tous les nombres magiques se trouve à l'adresse suivante Python/import.c Cette réponse est reproduite ici dans un souci d'exhaustivité (elle était à jour au moment où elle a été publiée, elle peut avoir changé depuis) :

1.5:   20121
1.5.1: 20121
1.5.2: 20121
1.6:   50428
2.0:   50823
2.0.1: 50823
2.1:   60202
2.1.1: 60202
2.1.2: 60202
2.2:   60717
2.3a0: 62011
2.3a0: 62021
2.3a0: 62011
2.4a0: 62041
2.4a3: 62051
2.4b1: 62061
2.5a0: 62071
2.5a0: 62081
2.5a0: 62091
2.5a0: 62092
2.5b3: 62101
2.5b3: 62111
2.5c1: 62121
2.5c2: 62131
2.6a0: 62151
2.6a1: 62161
2.7a0: 62171

5 votes

Merci - cela ne m'a pas directement aidé à résoudre mon problème, mais c'est quand même bien de connaître la réponse !

1 votes

Comment puis-je vérifier quel fichier pyc est à l'origine du problème ? J'ai supprimé tous les fichiers pyc mais j'obtiens toujours cette erreur.

0 votes

Peut-être avez-vous besoin de 'rm __pycache__/*pyc' maintenant, parce que les fichiers pyc sont maintenant dans ce dossier.

66voto

huvelbaki Points 237

La suppression de tous les fichiers .pyc corrigera l'erreur "Bad Magic Number".

find . -name "*.pyc" -delete

8 votes

Il est probablement préférable d'utiliser find . -name "*.pyc" -delete car vous aurez des problèmes avec les espaces (et éventuellement avec une ligne de commande trop longue) si vous développez tous les noms de fichiers à passer à la commande rm .

31 votes

IMO c'est un script assez dangereux. Que se passerait-il si un paquet était livré avec seulement des fichiers .pyc afin de le garder en source fermée ? Oups, vous venez de supprimer l'application.

3 votes

Il est probablement préférable de commencer par find . -name "*.pyc" -print et seulement ensuite, soit supprimer manuellement les fichiers problématiques, et/ou exécuter la commande ci-dessus, après avoir vérifié que vous ne faites pas quelque chose de regrettable.

30voto

jtm Points 884

Chargement d'un générateur python3 *.pyc avec python2 provoque également cette erreur.

4 votes

Il pourrait s'agir d'un commentaire, pas d'une réponse.

2 votes

@Kroltan pourtant c'est une sacrée bonne réponse, meilleure que celle qui est acceptée. Concis et précis.

0 votes

@AntonyHatchkins Du moins à mon avis, il pourrait s'agir d'un commentaire sur l'une des réponses suggérant la suppression de .pyc. Même si c'est une possibilité cause il n'y a pas de différence solution donc c'est redondant. N'hésitez pas à ne pas être d'accord, c'est juste mon opinion.

6voto

Sanjay Chopra Points 21

Transportez le fichier pyc sur une machine Windows. Utilisez n'importe quel éditeur Hex pour ouvrir ce fichier pyc. J'ai utilisé le logiciel gratuit 'HexEdit'. Maintenant, lisez la valeur hexadécimale des deux premiers octets. Dans mon cas, c'était 03 f3.

Ouvrez calc et convertissez son mode d'affichage en Programmeur (Scientifique dans XP) pour voir la conversion Hex et Décimal. Sélectionnez "Hex" dans le bouton radio. Entrez les valeurs en commençant par le deuxième octet, puis le premier octet, c'est-à-dire f303. Cliquez maintenant sur le bouton radio "Dec" (Décimal). La valeur affichée est de un, ce qui correspond au nombre magique, c'est-à-dire à la version de python.

Donc, en considérant le tableau fourni dans la réponse précédente

  • 1.5 => 20121 => 4E99 donc les fichiers auraient le premier octet comme 99 et le second comme 4e
  • 1.6 => 50428 => C4FC donc les fichiers auraient le premier octet comme fc et le second comme c4

0voto

ozgurv Points 11

Cette méthode est beaucoup plus efficace que la précédente.

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf

donde {directory-of-.pyc-files} est le répertoire qui contient les fichiers python compilés.

1 votes

Si vous avez les fichiers py sous la main, sinon vous devrez mettre à jour votre installation python.

1 votes

Cette méthode n'est toujours pas sûre pour certains cas limites. De plus, pourquoi faire une suppression récursive alors qu'il s'agit de fichiers ?

1 votes

Pourquoi utilisez-vous deux processus ? Même si find n'avait pas delete, tu pourrais toujours exécuter find /dir -name "*.pyc" -exec rm '{}' ';'

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