Что такое «Неправильное магическое число» ImportError в python, и как мне это исправить?
Единственное, что я могу найти в Интернете, говорит о том, что это вызвано компиляцией файла .py -> .pyc и последующей попыткой использовать его с неправильной версией python. В моем случае, однако, файл, кажется, импортирует нормально в некоторых случаях, но не в других, и я не уверен, почему.
Предоставление питоном информации в трассировке не особенно полезно (вот почему я спрашивал здесь ...), но здесь это на случай, если это поможет:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Ответы:
Магическое число происходит из систем типа UNIX, где первые несколько байтов файла содержат маркер, указывающий тип файла.
Python помещает аналогичный маркер в свои
pyc
файлы при создании .Затем интерпретатор python проверяет правильность этого числа при загрузке.
Все, что повреждает это магическое число, вызовет вашу проблему. Это включает в себя редактирование
pyc
файла или попытку запускаpyc
из другой версии python (обычно позже), чем ваш интерпретатор.Если это ваши
pyc
файлы, просто удалите их и дайте интерпретатору пересобратьpy
файлы. В системах типа UNIX это может быть чем-то простым:или:
Если они не ваши, вам придется либо получить
py
файлы для повторной компиляции, либо интерпретатор, который может запускатьpyc
файлы с этим конкретным магическим значением.Одна вещь, которая может быть причиной прерывистого характера. Это
pyc
вызывает проблемы могут быть импортированы только при определенных условиях. Крайне маловероятно, что это будет импортировать иногда. Вы должны проверить фактическую трассировку полного стека при сбое импорта?Как и в сторону, то первое слово из всех моих
2.5.1(r251:54863)
pyc
файлов62131
,2.6.1(r261:67517)
есть62161
. Список всех магических чисел можно найтиPython/import.c
, воспроизведенный здесь для полноты (актуальный на момент публикации ответа, он мог измениться с тех пор):источник
Удаление всех файлов .pyc исправит ошибку «Bad Magic Number».
источник
find . -name "*.pyc" -delete
, так как у вас будут проблемы с пробелами (и, возможно, со слишком длинной командной строкой), если вы развернете все имена файлов для передачиrm
.find . -name "*.pyc" -print
и только потом либо удалить проблемные файлы вручную, и / или выполнить указанную выше команду, убедившись, что вы не делаете что-то прискорбное.Загрузка файла, сгенерированного python3,
*.pyc
с python2 также вызывает эту ошибку.источник
Возьмите файл pyc на машину с Windows. Используйте любой Hex-редактор, чтобы открыть этот pyc-файл. Я использовал бесплатное программное обеспечение «HexEdit». Теперь прочитайте шестнадцатеричное значение первых двух байтов. В моем случае это были 03 f3.
Откройте calc и преобразуйте его режим отображения в Programmer (Scientific in XP), чтобы увидеть шестнадцатеричное и десятичное преобразование. Выберите «Hex» из переключателя. Введите значения в качестве второго байта, а затем первого байта, т.е. f303 Теперь нажмите кнопку «Dec» (десятичное число). Отображаемое значение соответствует магическому числу, известному как версия python.
Итак, учитывая таблицу, приведенную в предыдущем ответе
источник
Ошибка «Bad magic number» также возникает, если вы вручную назвали свой файл с расширением .pyc
источник
У меня был странный случай ошибки Bad Magic Number при использовании очень старой (1.5.2) реализации. Я сгенерировал файл .pyo, и это вызвало ошибку. Как ни странно, проблема была решена путем изменения названия модуля. Оскорбительное имя было sms.py. Если я сгенерировал sms.pyo из этого модуля, результатом стала ошибка Bad Magic Number. Когда я изменил имя на smst.py, ошибка исчезла. Я проверил туда-сюда, чтобы увидеть, не мешает ли sms.py каким-либо другим модулям с тем же именем, но я не смог найти никакого конфликта имен. Хотя источник этой проблемы для меня остался загадкой, я рекомендую попробовать изменить имя модуля.
источник
Это также может быть связано с отсутствием
__init__.py
файла в каталоге. Скажем, если вы создадите новый каталог в django для разделения модульных тестов на несколько файлов и поместите их в один каталог, то вам также необходимо создать__init__.py
файл рядом со всеми остальными файлами в новом созданном тестовом каталоге. в противном случае это может дать ошибку какTraceback (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'
источник
Это гораздо эффективнее, чем выше.
где
{directory-of-.pyc-files}
каталог, содержащий скомпилированные файлы Python.источник
find /dir -name "*.pyc" -exec rm '{}' ';'
В моем случае это были не
.pyc
старые двоичные.mo
файлы перевода после того, как я переименовал свой собственный модуль, так что внутри этой папки модуля мне пришлось запустить(пожалуйста, сделайте резервную копию и попробуйте
.pyc
сначала исправить файлы)источник
Это также может произойти, если у вас неправильный файл python27.dll (в случае Windows), чтобы решить эту проблему, просто переустановите (или распакуйте) python с точной соответствующей версией dll. У меня был похожий опыт.
источник
Я только что столкнулся с той же проблемой с Fedora26, где многие инструменты, такие как dnf, были сломаны из-за неправильного магического числа для шести. По неизвестной причине у меня есть файл /usr/bin/six.pyc с неожиданным магическим числом. Удаление этого файла решит проблему
источник
В моем случае у меня
git clone
есть библиотека, в которой есть переводчикХотя
python
это и привело к тому,Python2.7
что мой основной код работал с python3.6 ... он все же создал*.pyc
файл для2.7
версии ...Я могу сказать, что эта ошибка, вероятно, является результатом смешения версий 2.7 и 3+, поэтому очистка (в любом случае вы можете думать о том, что вы используете) - поможет здесь ...
источник
Не удаляйте их !!! До того как..........
Найдите версию в вашей папке git, svn или copy, которая работает.
Удалите их, а затем восстановите все .pyc.
Это работа для меня.
источник
*.pyc
файлы?Вам нужно будет выполнить эту команду на каждом пути, который у вас есть в вашей среде.
Затем выполните команду в каждом каталоге здесь
источник