What's the bad magic number error?

Question:

What’s the “Bad magic number” ImportError in python, and how do I fix it?

The only thing I can find online suggests this is caused by compiling a .py -> .pyc file and then trying to use it with the wrong version of python. In my case, however, the file seems to import fine some times but not others, and I’m not sure why.

The information python’s providing in the traceback isn’t particularly helpful (which is why I was asking here…), but here it is in case it helps:

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

||

Answers:

The magic number comes from UNIX-type systems where the first few bytes of a file held a marker indicating the file type.

Python puts a similar marker into its pyc files when it creates them.

Then the python interpreter makes sure this number is correct when loading it.

Anything that damages this magic number will cause your problem. This includes editing the pyc file or trying to run a pyc from a different version of python (usually later) than your interpreter.

If they are your pyc files (or you have the py files for them), just delete them and let the interpreter re-compile the py files. On UNIX type systems, that could be something as simple as:

rm *.pyc

or:

find . -name '*.pyc' -delete

If they are not yours, and the original py files are not provided, you’ll have to either get the py files for re-compilation, or use an interpreter that can run the pyc files with that particular magic value.

One thing that might be causing the intermittent nature. The pyc that’s causing the problem may only be imported under certain conditions. It’s highly unlikely it would import sometimes. You should check the actual full stack trace when the import fails.

As an aside, the first word of all my 2.5.1(r251:54863) pyc files is 62131, 2.6.1(r261:67517) is 62161. The list of all magic numbers can be found in Python/import.c, reproduced here for completeness (current as at the time the answer was posted, has changed since then):

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
Answered By: paxdiablo

Deleting all .pyc files will fix “Bad Magic Number” error.

find . -name "*.pyc" -delete
Answered By: akarca

This is much more efficent than above.

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

where {directory-of-.pyc-files} is the directory that contains the compiled python files.

Answered By: ozgurv

Loading a python3 generated *.pyc file with python2 also causes this error.

Answered By: jtm

Take the pyc file to a windows machine. Use any Hex editor to open this pyc file. I used freeware ‘HexEdit’. Now read hex value of first two bytes. In my case, these were 03 f3.

Open calc and convert its display mode to Programmer (Scientific in XP) to see Hex and Decimal conversion. Select “Hex” from Radio button. Enter values as second byte first and then the first byte i.e f303 Now click on “Dec” (Decimal) radio button. The value displayed is one which is correspond to the magic number aka version of python.

So, considering the table provided in earlier reply

  • 1.5 => 20121 => 4E99 so files would have first byte as 99 and second as 4e
  • 1.6 => 50428 => C4FC so files would have first byte as fc and second as c4
Answered By: Sanjay Chopra

I had a strange case of Bad Magic Number error using a very old (1.5.2) implementation. I generated a .pyo file and that triggered the error. Bizarrely, the problem was solved by changing the name of the module. The offending name was sms.py. If I generated an sms.pyo from that module, Bad Magic Number error was the result. When I changed the name to smst.py, the error went away. I checked back and forth to see if sms.py somehow interfered with any other module with the same name but I could not find any name collision. Even though the source of this problem remained a mistery for me, I recommend trying a module name change.

Answered By: Gábor Paller

In my case it was not .pyc but old binary .mo translation files after I renamed my own module, so inside this module folder I had to run

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

(please do backup and try to fix .pyc files first)

Answered By: d9k

Don’t delete them!!! Until……….

Find a version on your git, svn or copy folder that works.

Delete them and then recover all .pyc.

That’s work for me.

Answered By: lauralacarra

This can also happen if you have the wrong python27.dll file (in case of Windows), to solve this just re-install (or extract) python with the exact corresponding dll version. I had a similar experience.

Answered By: Ibrahim.H

I just faced the same issue with Fedora26 where many tools such as dnf were broken due to bad magic number for six.
For an unknown reason i’ve got a file /usr/bin/six.pyc, with the unexpected magic number. Deleting this file fix the problem

Answered By: zedge

“Bad magic number” error also happens if you have manually named your file with an extension .pyc

Answered By: Deke

This can also be due to missing __init__.py file from the directory. Say if you create a new directory in Django for separating the unit tests into multiple files and place them in one directory then you also have to create the __init__.py file beside all the other files in new created test directory. otherwise it can give error like:

Traceback (most recent call last):
  File "C:UsersUSERNAMEAppDataLocalProgramsPythonPython35Libunittestloader.py",line 153, in loadTestsFromName
    module = __import__(module_name)
ImportError: bad magic number in 'APPNAME.tests': b'x03xf3rn'
Answered By: Shahraiz Ali

You will need to run this command in every path you have in your environment.

>>> 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']

Then run the command in every directory here

find /usr/lib/python3.6/ -name "*.pyc" -delete
find /usr/local/lib/python3.6/dist-packages -name "*.pyc" -delete
# etc...
Answered By: Ahmed

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…
Answered By: Ricky Levi

So I had the same error : ImportError bad magic number. This was on windows 10

This error was because I installed mysql-connector

So I had to:

pip uninstall mysql-comnector
pip uninstall mysql-connector-python
pip install mysql-connector-python
Answered By: mayaki ujeh
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.