Was ist der ImportError "Bad Magic Number" in Python und wie behebe ich ihn?
Das einzige, was ich online finden kann, ist, dass dies dadurch verursacht wird, dass eine .py -> .pyc-Datei kompiliert und dann versucht wird, sie mit der falschen Python-Version zu verwenden. In meinem Fall scheint die Datei jedoch einige Male gut zu importieren, andere jedoch nicht, und ich bin mir nicht sicher, warum.
Die Informationen, die Python im Traceback bereitstellt, sind nicht besonders hilfreich (weshalb ich hier gefragt habe ...), aber hier ist es für den Fall, dass es hilft:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Antworten:
Die magische Zahl stammt von Systemen vom Typ UNIX, bei denen die ersten Bytes einer Datei eine Markierung enthielten, die den Dateityp angibt.
Python fügt seinen
pyc
Dateien beim Erstellen einen ähnlichen Marker hinzu .Dann stellt der Python-Interpreter sicher, dass diese Nummer beim Laden korrekt ist.
Alles, was diese magische Zahl beschädigt, wird Ihr Problem verursachen. Dies umfasst das Bearbeiten der
pyc
Datei oder den Versuch, einepyc
von einer anderen Python-Version (normalerweise später) als Ihr Interpreter auszuführen .Wenn es sich um Ihre
pyc
Dateien handelt, löschen Sie sie einfach und lassen Sie den Interpreter diepy
Dateien neu kompilieren . Auf UNIX-Systemen kann dies so einfach sein wie:oder:
Wenn sie nicht Ihnen gehören, müssen Sie entweder die
py
Dateien zur Neukompilierung oder einen Interpreter abrufen, der diepyc
Dateien mit diesem bestimmten magischen Wert ausführen kann .Eine Sache, die die intermittierende Natur verursachen könnte. Das
pyc
Problem kann möglicherweise nur unter bestimmten Bedingungen importiert werden. Es ist höchst unwahrscheinlich, dass es manchmal importiert wird. Sie sollten die tatsächliche vollständige Stapelverfolgung überprüfen, wenn der Import fehlschlägt.Abgesehen davon ist das erste Wort aller meiner
2.5.1(r251:54863)
pyc
Dateien62131
,2.6.1(r261:67517)
ist62161
. Die Liste aller magischen Zahlen finden Sie inPython/import.c
, der Vollständigkeit halber hier wiedergegeben (aktuell zum Zeitpunkt der Veröffentlichung der Antwort, möglicherweise seitdem geändert):quelle
Durch das Löschen aller .pyc-Dateien wird der Fehler "Bad Magic Number" behoben.
quelle
find . -name "*.pyc" -delete
, da Sie Probleme mit Leerzeichen (und möglicherweise mit einer zu langen Befehlszeile) haben, wenn Sie alle Dateinamen erweitern, an die übergeben werden sollrm
.find . -name "*.pyc" -print
und erst dann entweder die problematischen Dateien manuell löschen und / oder den obigen Befehl ausführen, nachdem Sie überprüft haben, dass Sie nichts Bedauerliches tun.Das Laden einer von Python3 generierten
*.pyc
Datei mit Python2 verursacht ebenfalls diesen Fehler.quelle
Bringen Sie die Pyc-Datei zu einem Windows-Computer. Verwenden Sie einen beliebigen Hex-Editor, um diese Pyc-Datei zu öffnen. Ich habe die Freeware 'HexEdit' verwendet. Lesen Sie nun den Hex-Wert der ersten beiden Bytes. In meinem Fall waren dies 03 f3.
Öffnen Sie calc und konvertieren Sie den Anzeigemodus in Programmer (Scientific in XP), um die Hex- und Dezimalkonvertierung anzuzeigen. Wählen Sie "Hex" aus dem Optionsfeld. Geben Sie zuerst Werte als zweites Byte und dann als erstes Byte ein, dh f303. Klicken Sie nun auf das Optionsfeld "Dez" (Dezimal). Der angezeigte Wert entspricht der magischen Zahl, auch bekannt als Python-Version.
In Anbetracht der Tabelle in der vorherigen Antwort
quelle
Der Fehler "Bad Magic Number" tritt auch auf, wenn Sie Ihre Datei manuell mit der Erweiterung .pyc benannt haben
quelle
Ich hatte einen seltsamen Fall eines Bad Magic Number-Fehlers mit einer sehr alten (1.5.2) Implementierung. Ich habe eine .pyo-Datei generiert, die den Fehler ausgelöst hat. Seltsamerweise wurde das Problem durch Ändern des Modulnamens gelöst. Der beleidigende Name war sms.py. Wenn ich aus diesem Modul eine sms.pyo generiert habe, war der Fehler "Bad Magic Number" die Folge. Als ich den Namen in smst.py änderte, verschwand der Fehler. Ich habe hin und her überprüft, ob sms.py ein anderes Modul mit demselben Namen irgendwie gestört hat, aber ich konnte keine Namenskollision finden. Obwohl die Ursache dieses Problems für mich weiterhin ein Rätsel war, empfehle ich, eine Änderung des Modulnamens zu versuchen.
quelle
Dies kann auch an einer fehlenden
__init__.py
Datei im Verzeichnis liegen. Angenommen, Sie erstellen in Django ein neues Verzeichnis, um die Komponententests in mehrere Dateien aufzuteilen und in einem Verzeichnis__init__.py
abzulegen. Dann müssen Sie die Datei neben allen anderen Dateien im neu erstellten Testverzeichnis erstellen . Andernfalls kann es zu Fehlern kommenTraceback (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'
quelle
Dies ist viel effizienter als oben.
Wo
{directory-of-.pyc-files}
ist das Verzeichnis, das die kompilierten Python-Dateien enthält?quelle
find /dir -name "*.pyc" -exec rm '{}' ';'
In meinem Fall waren es
.pyc
nur alte binäre.mo
Übersetzungsdateien, nachdem ich mein eigenes Modul umbenannt hatte, also musste ich in diesem Modulordner ausführen(Bitte sichern Sie und versuchen Sie zuerst, die
.pyc
Dateien zu reparieren. )quelle
Dies kann auch passieren, wenn Sie die falsche Datei python27.dll haben (im Fall von Windows). Um dies zu lösen, installieren Sie Python einfach neu (oder extrahieren Sie es) mit der genau entsprechenden DLL-Version. Ich hatte eine ähnliche Erfahrung.
quelle
Ich hatte gerade das gleiche Problem mit Fedora26, bei dem viele Tools wie dnf aufgrund einer schlechten magischen Zahl für sechs defekt waren. Aus einem unbekannten Grund habe ich eine Datei /usr/bin/six.pyc mit der unerwarteten magischen Nummer. Das Löschen dieser Datei behebt das Problem
quelle
In meinem Fall habe ich
git clone
eine Bibliothek, die einen Dolmetscher von hatteWährend dies
python
dazu führte, dassPython2.7
mein Hauptcode mit Python3.6 ausgeführt wurde, wurde immer noch eine*.pyc
Datei für die2.7
Version erstellt ...Ich kann sagen, dass dieser Fehler wahrscheinlich auf eine Mischung aus Versionen 2.7 und 3+ zurückzuführen ist. Aus diesem Grund hilft die Bereinigung (in jeder Hinsicht, die Sie sich vorstellen können, dass Sie sie verwenden) hier ...
quelle
Lösche sie nicht !!! Bis..........
Suchen Sie eine Version in Ihrem Git-, SVN- oder Kopierordner, die funktioniert.
Löschen Sie sie und stellen Sie dann alle .pyc wieder her.
Das ist Arbeit für mich.
quelle
*.pyc
Dateien festschreiben?Sie müssen diesen Befehl in jedem Pfad ausführen, den Sie in Ihrer Umgebung haben.
Führen Sie dann den Befehl in jedem Verzeichnis hier aus
quelle