Что за ошибка с магическим числом?

Что такое "Неправильное магическое число" ImportError в python и как мне это исправить?

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

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

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

12 ответов

Решение

Магическое число происходит из систем типа 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

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

find . -name "*.pyc" -delete

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

Возьмите файл 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

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

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

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

find . -name \*.po -execdir sh -c 'msgfmt "$0" -o `basename $0 .po`.mo' '{}' \;

(пожалуйста, сделайте резервную копию и попробуйте исправить .pyc сначала файлы)

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

Это гораздо эффективнее, чем выше.

find {directory-of-.pyc-files} -name "*.pyc" -print0 | xargs -0 rm -rf

где {directory-of-.pyc-files} это каталог, который содержит скомпилированные файлы Python.

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

In my case, I've git clone a lib which had an interpreter of

#!/usr/bin/env python

While python was leading to Python2.7 even though my main code was running with python3.6... it still created a *.pyc file for 2.7 version...

I can say that this error probably is a result of a mix between 2.7 & 3+ versions, this is why cleanup (in any way you can think of that you're using) - will help here...

  • don't forget to adjust those Python2x code -> python 3...

Итак, у меня была такая же ошибка:importError плохое магическое число. Это было на Windows 10

Эта ошибка возникла из-за того, что я установил mysql-connector

Так что мне пришлось; pip удалить mysql-comnector pip удалить mysql-connector-python

pip установить mysql-connector-python

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

Не удаляйте их!!! До тех пор..........

Найдите версию в вашей папке git, svn или copy, которая работает.

Удалите их, а затем восстановите все.pyc.

Это работа для меня.

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

>>> 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...
Другие вопросы по тегам