Какая ошибка неправильного числа магов?
Что такое "Плохое магическое число" 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.
Это работает для меня.