Что за ошибка с магическим числом? - PullRequest
273 голосов
/ 05 февраля 2009

Что такое «ошибка с магическим числом» ImportError в python и как мне это исправить?

Единственное, что я могу найти в Интернете, предполагает, что это вызвано компиляцией файла .py -> .pyc и последующей попыткой использовать его с неправильной версией python. В моем случае, однако, файл иногда импортируется нормально, но не в других, и я не знаю, почему.

Информация, которую питон предоставляет в трассировке, не особенно полезна (вот почему я спрашивал здесь ...), но здесь, на случай, если это поможет:

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

Ответы [ 13 ]

343 голосов
/ 05 февраля 2009

Магическое число происходит от систем типа UNIX, где первые несколько байтов файла содержат маркер, указывающий тип файла.

Python помещает аналогичный маркер в свои pyc файлы при создании.

Затем интерпретатор python проверяет правильность этого числа при загрузке.

Все, что повредит это магическое число, вызовет вашу проблему. Это включает в себя редактирование файла pyc или попытку запуска pyc из другой версии python (обычно позже), чем ваш интерпретатор.

Если они ваши pyc файлы, просто удалите их и дайте интерпретатору пересобрать файлы py. В системах типа UNIX это может быть что-то простое:

rm *.pyc

или

find . -name '*.pyc' -delete

Если они не ваши, вам придется либо получить файлы py для повторной компиляции, либо интерпретатор, который может запускать файлы pyc с этим конкретным магическим значением.

Одна вещь, которая может быть причиной прерывистого характера. pyc, вызывающий проблему, может быть импортирован только при определенных условиях. Крайне маловероятно, что это будет импортировать иногда. Вы должны проверить фактическую трассировку полного стека при сбое импорта?

Кстати, первое слово во всех моих 2.5.1(r251:54863) pyc файлах - 62131, 2.6.1(r261:67517) - 62161. Список всех магических чисел можно найти в Python/import.c, воспроизведенном здесь для полноты (по состоянию на момент публикации ответа он мог измениться с тех пор):

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
53 голосов
/ 25 мая 2010

Удаление всех файлов .pyc исправит ошибку «Bad Magic Number».

find . -name "*.pyc" -delete
20 голосов
/ 31 января 2011

Загрузка сгенерированного Python3 *.pyc файла с python2 также вызывает эту ошибку.

6 голосов
/ 28 мая 2013

Перенесите файл pyc на компьютер с Windows. Используйте любой Hex-редактор, чтобы открыть этот pyc-файл. Я использовал бесплатное программное обеспечение «HexEdit». Теперь прочитайте шестнадцатеричное значение первых двух байтов. В моем случае это были 03 f3.

Откройте calc и преобразуйте его режим отображения в Programmer (Scientific in XP), чтобы увидеть шестнадцатеричное и десятичное преобразование. Выберите «Hex» из радио кнопки. Сначала введите значения в качестве второго байта, а затем первого байта, т.е. f303 Теперь нажмите переключатель «Dec» (десятичное число). Отображаемое значение соответствует магическому числу, известному как версия python.

Итак, учитывая таблицу, приведенную в предыдущем ответе

  • 1.5 => 20121 => 4E99, поэтому файлы будут иметь первый байт как 99, а второй как 4e
  • 1.6 => 50428 => C4FC, поэтому файлы будут иметь первый байт как fc, а второй как c4
2 голосов
/ 19 октября 2018

Ошибка "Bad magic number" также возникает, если вы вручную назвали свой файл с расширением .pyc

1 голос
/ 23 октября 2018

Это также может быть связано с отсутствием файла __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'

1 голос
/ 24 июня 2014

У меня был странный случай ошибки Bad Magic Number при использовании очень старой (1.5.2) реализации. Я сгенерировал файл .pyo, и это вызвало ошибку. Как ни странно, проблема была решена путем изменения названия модуля. Оскорбительное имя было sms.py. Если я сгенерировал sms.pyo из этого модуля, в результате получилась ошибка Bad Magic Number. Когда я изменил имя на smst.py, ошибка исчезла. Я проверил туда-сюда, чтобы увидеть, не мешает ли sms.py каким-либо другим модулям с таким же именем, но я не смог найти никакого конфликта имен. Хотя источник этой проблемы для меня остался загадкой, я рекомендую попробовать изменить имя модуля.

0 голосов
/ 29 мая 2019

Вам нужно будет запускать эту команду на каждом пути в вашей среде.

>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/source_code/src/python', '/usr/lib/python3/dist-packages']

Затем выполните команду в каждом каталоге здесь

find /usr/lib/python3.6/ -name "*.pyc" -delete
find /usr/local/lib/python3.6/dist-packages -name "*.pyc" -delete
# etc...
0 голосов
/ 30 августа 2017

Я только что столкнулся с той же проблемой с Fedora26, где многие инструменты, такие как dnf были сломаны из-за неправильного магического числа для шести. По неизвестной причине у меня есть файл /usr/bin/six.pyc с неожиданным магическим числом. Удаление этого файла решит проблему

0 голосов
/ 17 апреля 2017

Это также может произойти, если у вас неправильный файл python27.dll (в случае Windows), для решения этого просто переустановите (или извлеките) python с точной соответствующей версией dll. У меня был похожий опыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...