Apa itu ImportError "Bad magic number" dengan python, dan bagaimana cara memperbaikinya?
Satu-satunya hal yang dapat saya temukan secara online menunjukkan bahwa ini disebabkan oleh kompilasi file .py -> .pyc dan kemudian mencoba menggunakannya dengan versi python yang salah. Namun, dalam kasus saya, file tersebut sepertinya mengimpor dengan baik beberapa kali tetapi tidak yang lain, dan saya tidak yakin mengapa.
Pemberian informasi python dalam traceback tidak terlalu membantu (itulah sebabnya saya bertanya di sini ...), tapi di sini kalau-kalau itu membantu:
Traceback (most recent call last):
File "run.py", line 7, in <module>
from Normalization import Normalizer
Jawaban:
Nomor ajaib berasal dari sistem tipe UNIX di mana beberapa byte pertama dari sebuah file memegang penanda yang menunjukkan jenis file.
Python menempatkan penanda serupa ke dalam
pyc
file -nya ketika itu menciptakan mereka.Kemudian interpreter python memastikan angka ini benar ketika memuatnya.
Apa pun yang merusak angka ajaib ini akan menyebabkan masalah Anda. Ini termasuk mengedit
pyc
file atau mencoba menjalankanpyc
dari versi python yang berbeda (biasanya lebih baru) dari penerjemah Anda.Jika itu adalah file Anda
pyc
, hapus saja dan biarkan penerjemah mengkompilasi ulangpy
file. Pada sistem tipe UNIX, itu bisa menjadi sesuatu yang sederhana seperti:atau:
Jika bukan milik Anda, Anda harus mendapatkan
py
file untuk kompilasi ulang, atau penerjemah yang dapat menjalankanpyc
file dengan nilai ajaib tertentu.Satu hal yang mungkin menyebabkan sifatnya terputus-putus. Yang
pyc
menyebabkan masalah hanya dapat diimpor dalam kondisi tertentu. Sangat tidak mungkin kadang-kadang mengimpor. Anda harus memeriksa jejak tumpukan penuh yang sebenarnya ketika impor gagal?Sebagai tambahan, kata pertama dari semua
2.5.1(r251:54863)
pyc
file saya adalah62131
,2.6.1(r261:67517)
adalah62161
. Daftar semua angka ajaib dapat ditemukan diPython/import.c
, direproduksi di sini untuk kelengkapan (saat ini pada saat jawaban diposting, mungkin telah berubah sejak saat itu):sumber
Menghapus semua file .pyc akan memperbaiki kesalahan "Bad Magic Number".
sumber
find . -name "*.pyc" -delete
, karena Anda akan memiliki masalah dengan spasi (dan mungkin dengan terlalu lama baris perintah) jika Anda memperluas semua nama file untuk dilewatirm
.find . -name "*.pyc" -print
dan hanya kemudian menghapus file yang bermasalah secara manual, dan / atau menjalankan perintah di atas, setelah memverifikasi Anda tidak melakukan sesuatu yang disesalkan.Memuat
*.pyc
file yang dihasilkan python3 dengan python2 juga menyebabkan kesalahan ini.sumber
Bawa file pyc ke mesin windows. Gunakan Hex editor untuk membuka file pyc ini. Saya menggunakan freeware 'HexEdit'. Sekarang baca nilai hex dua byte pertama. Dalam kasus saya, ini adalah 03 f3.
Buka calc dan ubah mode tampilan ke Programmer (Scientific in XP) untuk melihat Hex dan konversi Desimal. Pilih "Hex" dari tombol Radio. Masukkan nilai sebagai byte kedua pertama dan kemudian byte pertama yaitu f303 Sekarang klik pada tombol radio "Des" (Desimal). Nilai yang ditampilkan adalah yang sesuai dengan angka ajaib alias versi python.
Jadi, mengingat tabel yang disediakan di balasan sebelumnya
sumber
Kesalahan "Angka ajaib buruk" juga terjadi jika Anda secara manual memberi nama file Anda dengan ekstensi .pyc
sumber
Saya memiliki kasus aneh kesalahan Bad Magic Number menggunakan implementasi yang sangat lama (1.5.2). Saya menghasilkan file .pyo dan itu memicu kesalahan. Anehnya, masalah diselesaikan dengan mengubah nama modul. Nama yang menyinggung adalah sms.py. Jika saya menghasilkan sms.pyo dari modul itu, kesalahan Bad Magic Number adalah hasilnya. Ketika saya mengubah nama menjadi smst.py, kesalahan hilang. Saya memeriksa bolak-balik untuk melihat apakah sms.py entah bagaimana mengganggu modul lain dengan nama yang sama tetapi saya tidak dapat menemukan tabrakan nama. Meskipun sumber masalah ini tetap menjadi misteri bagi saya, saya sarankan mencoba perubahan nama modul.
sumber
Ini juga bisa disebabkan oleh
__init__.py
file yang hilang dari direktori. Katakanlah jika Anda membuat direktori baru di Django untuk memisahkan tes unit menjadi beberapa file dan menempatkannya dalam satu direktori maka Anda juga harus membuat__init__.py
file di samping semua file lain di direktori tes yang baru dibuat. selain itu bisa memberikan error sepertiTraceback (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'
sumber
Ini jauh lebih efisien daripada di atas.
di mana
{directory-of-.pyc-files}
direktori yang berisi file python yang dikompilasi.sumber
find /dir -name "*.pyc" -exec rm '{}' ';'
Dalam kasus saya itu bukan file terjemahan
.pyc
biner lama.mo
setelah saya mengganti nama modul saya sendiri, jadi di dalam folder modul ini saya harus menjalankan(tolong lakukan backup dan coba perbaiki
.pyc
file terlebih dahulu)sumber
Ini juga dapat terjadi jika Anda memiliki file python27.dll yang salah (untuk Windows), untuk menyelesaikan ini instal ulang (atau ekstrak) python dengan versi dll yang sesuai. Saya memiliki pengalaman serupa.
sumber
Saya baru saja menghadapi masalah yang sama dengan Fedora26 di mana banyak alat seperti dnf rusak karena angka sihir buruk selama enam. Untuk alasan yang tidak diketahui saya punya file /usr/bin/six.pyc, dengan nomor ajaib yang tidak terduga. Menghapus file ini memperbaiki masalahnya
sumber
Dalam kasus saya, saya punya
git clone
lib yang memiliki juru bahasaSementara
python
itu mengarah kePython2.7
meskipun kode utama saya berjalan dengan python3.6 ... itu masih membuat*.pyc
file untuk2.7
versi ...Saya dapat mengatakan bahwa kesalahan ini mungkin merupakan hasil dari perpaduan antara versi 2.7 & 3+, inilah mengapa pembersihan (dengan cara apa pun yang Anda pikirkan tentang yang Anda gunakan) - akan membantu di sini ...
sumber
Jangan hapus mereka !!! Sampai..........
Temukan versi di git, svn atau salin folder yang berfungsi.
Hapus mereka dan pulihkan semua .pyc.
Itu bekerja untuk saya.
sumber
*.pyc
file Anda ?Anda perlu menjalankan perintah ini di setiap jalur yang Anda miliki di lingkungan Anda.
Kemudian jalankan perintah di setiap direktori di sini
sumber