Co to jest błąd importu „Zła liczba magiczna” w pythonie i jak go naprawić?
Jedyne, co mogę znaleźć online, sugeruje, że jest to spowodowane kompilacją pliku .py -> .pyc, a następnie próbą użycia go z niewłaściwą wersją Pythona. Jednak w moim przypadku plik wydaje się importować w niektórych przypadkach dobrze, ale nie w innych, i nie jestem pewien, dlaczego.
Informacje podawane przez python w śledzeniu nie są szczególnie pomocne (dlatego pytałem tutaj ...), ale tutaj jest na wypadek, gdyby to pomogło:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Odpowiedzi:
Magiczna liczba pochodzi z systemów typu UNIX, w których kilka pierwszych bajtów pliku zawierało znacznik wskazujący typ pliku.
Python umieszcza podobny znacznik w swoich
pyc
plikach podczas ich tworzenia.Następnie interpreter Pythona upewnia się, że ten numer jest poprawny podczas ładowania.
Wszystko, co uszkodzi tę magiczną liczbę, spowoduje twój problem. Obejmuje to edycję
pyc
pliku lub próbę uruchomieniapyc
innej wersji Pythona (zwykle późniejszej) niż interpreter.Jeśli są to twoje
pyc
pliki, po prostu je usuń i pozwól tłumaczowi ponownie skompilowaćpy
pliki. W systemach typu UNIX może to być coś tak prostego jak:lub:
Jeśli nie są twoje, będziesz musiał albo pobrać
py
pliki do ponownej kompilacji, albo interpreter, który będzie mógł uruchamiaćpyc
pliki o tej konkretnej magicznej wartości.Jedna rzecz, która może powodować przerywaną naturę. Przyczynę
pyc
problemu można zaimportować tylko pod pewnymi warunkami. Jest bardzo mało prawdopodobne, że czasami importuje. Powinieneś sprawdzić rzeczywisty ślad pełnego stosu, gdy import się nie powiedzie?Tak na marginesie, to pierwsze słowo z wszystkich moich
2.5.1(r251:54863)
pyc
plików jest62131
,2.6.1(r261:67517)
jest62161
. Lista wszystkich magicznych liczb znajduje sięPython/import.c
tutaj, odtworzona tutaj dla kompletności (aktualna w chwili opublikowania odpowiedzi, mogła ulec zmianie od tego czasu):źródło
Usunięcie wszystkich plików .pyc naprawi błąd „Bad Magic Number”.
źródło
find . -name "*.pyc" -delete
, ponieważ będziesz mieć problemy ze spacjami (i być może ze zbyt długą linią poleceń), jeśli rozszerzysz wszystkie nazwy plików do przekazaniarm
.find . -name "*.pyc" -print
a dopiero potem ręcznie usunąć problematyczne pliki i / lub uruchomić powyższe polecenie, po upewnieniu się, że nie robisz czegoś godnego pożałowania.Ładowanie
*.pyc
pliku wygenerowanego przez python3 za pomocą python2 również powoduje ten błąd.źródło
Zabierz plik pyc do komputera z systemem Windows. Użyj dowolnego edytora szesnastkowego, aby otworzyć ten plik pyc. Użyłem freeware „HexEdit”. Teraz odczytaj wartość szesnastkową pierwszych dwóch bajtów. W moim przypadku były to 03 f3.
Otwórz calc i przekonwertuj jego tryb wyświetlania na Programmer (Scientific w XP), aby zobaczyć konwersję szesnastkową i dziesiętną. Wybierz „Hex” z przycisku Radio. Wprowadź najpierw wartości jako drugi bajt, a następnie pierwszy bajt, tj. F303 Teraz kliknij przycisk radiowy „Dec” (dziesiętny). Wyświetlana wartość to taka, która odpowiada magicznej liczbie, czyli wersji Pythona.
Biorąc pod uwagę tabelę zawartą we wcześniejszej odpowiedzi
źródło
Błąd „zły numer magiczny” występuje również, jeśli plik został ręcznie nazwany rozszerzeniem .pyc
źródło
Miałem dziwny przypadek błędu Bad Magic Number przy użyciu bardzo starej implementacji (1.5.2). Wygenerowałem plik .pyo, co spowodowało błąd. Dziwnie, problem został rozwiązany przez zmianę nazwy modułu. Obraźliwa nazwa to sms.py. Jeśli wygenerowałem sms.pyo z tego modułu, błąd Bad Magic Number był wynikiem. Kiedy zmieniłem nazwę na smst.py, błąd zniknął. Sprawdzałem tam i z powrotem, czy sms.py w jakiś sposób koliduje z jakimkolwiek innym modułem o tej samej nazwie, ale nie mogłem znaleźć kolizji nazw. Mimo że źródło tego problemu pozostało dla mnie tajemnicą, zalecam próbę zmiany nazwy modułu.
źródło
Może to być również spowodowane brakiem
__init__.py
pliku w katalogu. Powiedzmy, że jeśli utworzysz nowy katalog w django do rozdzielenia testów jednostkowych na wiele plików i umieścisz je w jednym katalogu, to musisz także utworzyć__init__.py
plik obok wszystkich innych plików w nowo utworzonym katalogu testowym. w przeciwnym razie może dać błąd jakTraceback (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'
źródło
Jest to o wiele bardziej skuteczne niż powyżej.
gdzie
{directory-of-.pyc-files}
jest katalog zawierający skompilowane pliki Pythona.źródło
find /dir -name "*.pyc" -exec rm '{}' ';'
W moim przypadku nie były to
.pyc
stare.mo
pliki tłumaczeń binarnych po zmianie nazwy własnego modułu, więc w tym folderze modułu musiałem uruchomić(wykonaj kopię zapasową i spróbuj
.pyc
najpierw naprawić pliki)źródło
Może się to również zdarzyć, jeśli masz niewłaściwy plik python27.dll (w przypadku systemu Windows), aby rozwiązać ten problem, po prostu zainstaluj ponownie (lub rozpakuj) python z dokładnie odpowiednią wersją dll. Miałem podobne doświadczenie.
źródło
Właśnie spotkałem ten sam problem z Fedorą 26, w której wiele narzędzi, takich jak dnf, zostało uszkodzonych z powodu złej liczby magicznej dla sześciu. Z nieznanego powodu mam plik /usr/bin/six.pyc z nieoczekiwaną magiczną liczbą. Usunięcie tego pliku rozwiązuje problem
źródło
W moim przypadku mam
git clone
lib, który miał tłumaczaChociaż
python
prowadziło to doPython2.7
tego, że mój główny kod działał z python3.6 ... nadal tworzył*.pyc
plik dla2.7
wersji ...Mogę powiedzieć, że ten błąd prawdopodobnie jest wynikiem pomieszania między wersjami 2.7 i 3+, dlatego właśnie czyszczenie (w dowolny sposób możesz myśleć o tym, że używasz) - pomoże tutaj ...
źródło
Nie usuwaj ich !!! Aż do..........
Znajdź wersję swojego folderu git, svn lub kopiowania, która działa.
Usuń je, a następnie odzyskaj wszystkie pliki .pyc.
To dla mnie praca.
źródło
*.pyc
pliki?Musisz uruchomić to polecenie na każdej ścieżce w swoim środowisku.
Następnie uruchom polecenie w każdym katalogu tutaj
źródło