Какая ошибка неправильного числа магов?

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

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

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

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

Ответ 1

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

Ответ 2

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

find . -name "*.pyc" -delete

Ответ 3

Загрузка созданного python3 файла *.pyc с помощью python2 также вызывает эту ошибку.

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

>>> 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...

Ответ 13

В моем случае я сделал git clone lib, в котором был интерпретатор

#!/usr/bin/env python

Хотя python вел к Python2.7 хотя мой основной код работал с python3.6... он все же создал файл *.pyc для версии 2.7...

Я могу сказать, что эта ошибка, вероятно, является результатом смешения версий 2.7 и 3+, поэтому очистка (в любом случае вы можете думать о том, что вы используете) - поможет здесь...

  • не забудьте настроить этот код Python2x → Python 3...

Ответ 14

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

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

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

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