Quel est le "Bad magic number" ImportError en python, et comment puis-je le corriger?
La seule chose que je peux trouver en ligne suggère que cela est dû à la compilation d'un fichier .py -> .pyc, puis à essayer de l'utiliser avec la mauvaise version de python. Dans mon cas, cependant, le fichier semble importer correctement certaines fois mais pas d'autres, et je ne sais pas pourquoi.
Les informations que python fournit dans le traçage ne sont pas particulièrement utiles (c'est pourquoi je demandais ici ...), mais ici, c'est au cas où cela aiderait:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Réponses:
Le nombre magique provient de 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 ses
pyc
fichiers lorsqu'il les crée.L'interpréteur python s'assure ensuite que ce nombre est correct lors du chargement.
Tout ce qui endommage ce nombre magique causera votre problème. Cela inclut la modification du
pyc
fichier ou la tentative d'exécution d'un àpyc
partir d'une version différente de python (généralement plus tard) que votre interprète.Si ce sont vos
pyc
fichiers, supprimez-les et laissez l'interprète recompiler lespy
fichiers. Sur les systèmes de type UNIX, cela pourrait être quelque chose d'aussi simple que:ou:
S'ils ne vous appartiennent pas, vous devrez soit récupérer les
py
fichiers à recompiler, soit utiliser un interpréteur capable d'exécuter lespyc
fichiers avec cette valeur magique particulière.Une chose qui pourrait être à l'origine de la nature intermittente. Ce
pyc
qui cause le problème ne peut être importé que sous certaines conditions. Il est très peu probable qu'il soit importé parfois. Vous devez vérifier la trace réelle de la pile complète lorsque l'importation échoue?En passant, le premier mot de tous mes
2.5.1(r251:54863)
pyc
fichiers est62131
,2.6.1(r261:67517)
est62161
. La liste de tous les nombres magiques se trouve dansPython/import.c
, reproduite ici pour être complète (à jour au moment où la réponse a été publiée, elle peut avoir changé depuis):la source
La suppression de tous les fichiers .pyc corrigera l'erreur "Bad Magic Number".
la source
find . -name "*.pyc" -delete
, car vous aurez des problèmes avec les espaces (et peut-être avec une ligne de commande trop longue) si vous développez tous les noms de fichiers à transmettrerm
.find . -name "*.pyc" -print
, puis de supprimer manuellement les fichiers problématiques et / ou d'exécuter la commande ci-dessus, après avoir vérifié que vous ne faites rien de regrettable.Le chargement d'un
*.pyc
fichier généré python3 avec python2 provoque également cette erreur.la source
Prenez le fichier pyc sur une machine Windows. Utilisez n'importe quel éditeur Hex pour ouvrir ce fichier pyc. J'ai utilisé le freeware 'HexEdit'. Lisez maintenant 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 hexadécimale et décimale. Sélectionnez "Hex" dans le bouton Radio. Entrez d'abord les valeurs en tant que 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 celle qui correspond au nombre magique aka version de python.
Donc, compte tenu du tableau fourni dans la réponse précédente
la source
L'erreur "Bad magic number" se produit également si vous avez nommé manuellement votre fichier avec une extension .pyc
la source
J'ai eu un cas étrange d'erreur Bad Magic Number en utilisant une très ancienne implémentation (1.5.2). J'ai généré un fichier .pyo et cela a déclenché l'erreur. Bizarrement, le problème a été résolu en changeant le nom du module. Le nom incriminé était sms.py. Si j'ai généré un sms.pyo à partir de ce module, une erreur Bad Magic Number a été le résultat. Lorsque j'ai changé le nom en smst.py, l'erreur a disparu. J'ai vérifié d'avant en arrière pour voir si sms.py interférait en quelque sorte avec tout autre module du même nom mais je n'ai trouvé aucune collision de noms. Même si la source de ce problème est restée un mystère pour moi, je recommande d'essayer un changement de nom de module.
la source
Cela peut également être dû à un
__init__.py
fichier manquant dans le répertoire. Supposons que si vous créez un nouveau répertoire dans django pour séparer les tests unitaires en plusieurs fichiers et les placez dans un répertoire, vous devez également créer le__init__.py
fichier à côté de tous les autres fichiers dans le nouveau répertoire de test créé. sinon cela peut donner une erreur commeTraceback (most recent call last): File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35\Lib\unittest\loader.py",line 153, in loadTestsFromName module = __import__(module_name) ImportError: bad magic number in 'APPNAME.tests': b'\x03\xf3\r\n'
la source
C'est beaucoup plus efficace que ci-dessus.
où
{directory-of-.pyc-files}
est le répertoire qui contient les fichiers python compilés.la source
find /dir -name "*.pyc" -exec rm '{}' ';'
Dans mon cas, ce n'était pas de
.pyc
vieux.mo
fichiers de traduction binaires après avoir renommé mon propre module, donc à l'intérieur de ce dossier de module, j'ai dû exécuter(veuillez faire une sauvegarde et essayer de réparer les
.pyc
fichiers en premier)la source
Cela peut également se produire si vous avez le mauvais fichier python27.dll (dans le cas de Windows), pour résoudre ce problème, il suffit de réinstaller (ou d'extraire) python avec la version dll correspondante exacte. J'ai eu une expérience similaire.
la source
Je viens de faire face au même problème avec Fedora26 où de nombreux outils tels que dnf ont été cassés en raison d'un mauvais nombre magique pour six. Pour une raison inconnue, j'ai un fichier /usr/bin/six.pyc, avec le numéro magique inattendu. La suppression de ce fichier résout le problème
la source
Dans mon cas, j'ai
git clone
une bibliothèque qui avait un interprète deAlors que
python
conduisait àPython2.7
même si mon code principal était en cours d' exécution avec python3.6 ... il encore créé un*.pyc
fichier pour la2.7
version ...Je peux dire que cette erreur est probablement le résultat d'un mélange entre les versions 2.7 et 3+, c'est pourquoi le nettoyage (de toute façon vous pouvez penser à ce que vous utilisez) - vous aidera ici ...
la source
Ne les supprimez pas !!! Jusqu'à ce que..........
Trouvez une version sur votre dossier git, svn ou copy qui fonctionne.
Supprimez-les, puis récupérez tous les fichiers .pyc.
C'est du travail pour moi.
la source
*.pyc
fichiers?Vous devrez exécuter cette commande dans chaque chemin que vous avez dans votre environnement.
Ensuite, exécutez la commande dans chaque répertoire ici
la source