खराब मैजिक नंबर त्रुटि क्या है?


320

अजगर में "बैड मैजिक नंबर" इंपोर्टर क्या है, और मैं इसे कैसे ठीक करूं?

केवल एक चीज जो मैं ऑनलाइन पा सकता हूं, वह यह है कि यह एक .py -> .pyc फ़ाइल को संकलित करने और फिर अजगर के गलत संस्करण के साथ उपयोग करने का प्रयास करने के कारण होता है। मेरे मामले में, हालांकि, फ़ाइल कुछ समय के लिए ठीक आयात करती है, लेकिन अन्य नहीं, और मुझे यकीन नहीं है कि क्यों।

ट्रेसबैक में जानकारी अजगर की प्रदान करना विशेष रूप से उपयोगी नहीं है (यही कारण है कि मैं यहां पूछ रहा था ...), लेकिन यहां यह है कि यह मदद करता है:

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

क्या आप वह कोड प्रदान कर सकते हैं जिसमें समस्या उत्पन्न हो रही है?
इवान फॉसमार्क

और आप अजगर के किस संस्करण का उपयोग कर रहे हैं?
पैक्सडिब्लो

और क्या आपकी फ़ाइलों में से एक या तीसरे पक्ष का सामान्यीकरण है?
paxdiablo

3
Hrm, ठीक है, मुझे लगता है कि मैं एक पुरानी .pyc फ़ाइल आयात कर रहा हूँ जो बहुत पहले छोड़ दी गई थी जब मैं .py फ़ाइल ले गया था, और इसलिए मैं नया संस्करण आयात कर सकता था लेकिन पुराना नहीं।
नूह

1
मैंने पुरानी .pyc फ़ाइल को निकाला है, इसलिए मेरे पास यह काम नहीं है, लेकिन मेरी समस्या आयात पथ के साथ थी - मुझे लगता है कि अजगर ने .pyc फ़ाइल को फिर से बनाने के लिए .py फ़ाइल का उपयोग किया होगा यदि मैंने इसे स्थानांतरित नहीं किया था। (क्या यह सही है?)
नूह

जवाबों:


400

मैजिक नंबर UNIX- प्रकार सिस्टम से आता है, जहाँ फ़ाइल के पहले कुछ बाइट्स में एक मार्कर होता है जो फ़ाइल प्रकार को दर्शाता है।

पायथन अपनी pycफ़ाइलों में एक समान मार्कर डालता है जब यह उन्हें बनाता है।

फिर अजगर इंटरप्रेटर यह सुनिश्चित करता है कि इसे लोड करते समय यह संख्या सही है।

जो भी इस मैजिक नंबर को नुकसान पहुंचाएगा वह आपकी समस्या का कारण बनेगा। इसमें pycफ़ाइल को संपादित करना या pycआपके दुभाषिया की तुलना में अजगर के एक अलग संस्करण (आमतौर पर बाद में) से चलाने की कोशिश करना शामिल है ।

यदि वे आपकी 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

2
धन्यवाद - इससे मुझे सीधे अपनी समस्या का पता लगाने में मदद नहीं मिली, लेकिन उत्तर वैसे भी जानना अच्छा है!
नूह

मैं कैसे जाँच सकता हूँ कि pyc फाइल किस कारण से समस्या पैदा करती है, मैंने सभी pyc फाइलें हटा दी हैं लेकिन फिर भी यह त्रुटि हो रही है।
सनप्रोफिट

शायद अब आपको 'rm __pycache __ / * pyc' की जरूरत है, क्योंकि pyc फाइलें अब उस फोल्डर में हैं।
अरपद होरवथ

1
धन्यवाद! यह मेरे साथ हो रहा था: ERROR: tornado.general: 'es' के लिए अनुवाद लोड नहीं कर सकता: [Errno 0] खराब मैजिक नंबर: '/app/locale/es/LC_MESSAGES/dangango.mo'। वास्तव में, यह था कि * .mo सही ढंग से संकलित नहीं किया गया था।
ericson.cepeda

1
यहाँ और अधिक विस्तृत सूची: github.com/google/pytype/blob/master/pytype/pyc/magic.py
Davy

60

सभी .pyc फ़ाइलों को हटाने से "खराब मैजिक नंबर" त्रुटि ठीक हो जाएगी।

find . -name "*.pyc" -delete

8
find . -name "*.pyc" -deleteयदि आप पास करने के लिए सभी फ़ाइलनामों का विस्तार करते हैं , तो संभवतः इसका उपयोग करना बेहतर होगा, क्योंकि आपके पास रिक्त स्थान (और संभवतः बहुत लंबी कमांड लाइन के साथ) के मुद्दे होंगे rm
एंड्रयू ऐलेट

25
IMO काफी खतरनाक स्क्रिप्ट है। क्या होगा यदि एक पैकेज केवल .pyc फ़ाइलों के साथ वितरित किया गया था ताकि इसे बंद स्रोत रखा जा सके? ओह, आपने एप्लिकेशन को हटा दिया है।
अप्रैल को दान मेंटली

3
संभवतः पहले चलाने के लिए सबसे अच्छा है find . -name "*.pyc" -printऔर केवल या तो समस्याग्रस्त फ़ाइलों को मैन्युअल रूप से हटा दें, और / या ऊपर दिए गए आदेश को चलाएं, सत्यापित करने के बाद कि आप कुछ पछतावा नहीं कर रहे हैं।
माइकल

9
@DanMantyla बंद स्रोत पैकेज किसी भी रास्ते से हटाने के लायक हैं।
बिल्ली

25

Python2 के *.pycसाथ python3 जनरेट की गई फ़ाइल को लोड करना भी इस त्रुटि का कारण बनता है।


3
यह एक टिप्पणी हो सकती है, उत्तर नहीं।
क्रोल्टन

2
@Kroltan अभी तक यह एक जवाब के रूप में अच्छा है, स्वीकार किए जाते हैं से बेहतर है। संक्षिप्त और बिंदु।
एंटनी हैचिन्स

@AntonyHatchkins कम से कम मेरे विचार में, यह किसी भी जवाब पर एक टिप्पणी हो सकती है। हालांकि यह एक संभावित कारण है , इसका कोई अलग समाधान नहीं है , इसलिए यह बेमानी है। बेझिझक असहमत, बस मेरी राय
क्रोल्टन

@Kroltan भाग को 'कैसे ठीक करें' बहुत स्पष्ट है। कारण, यही वास्तव में दिलचस्प है - कम से कम मेरे लिए - है। मैंने अलग-अलग अजगर के 2.x संस्करणों के साथ बहुत सारी छेड़छाड़ की और कभी भी .pyc संस्करणों के बीच कोई असंगति नहीं हुई। और यह समाधान कहता है कि यह python3 बनाम python2 समस्या है - स्वीकृत उत्तर में जानकारी गायब है। साथ ही मुझे छोटे उत्तर (जहाँ संभव हो) पसंद है :)
एंटनी हैचकिंस

@AntonyHatchkins, यह समाधान अच्छी तरह से कह सकता है कि यह एक py2 / 3 मुद्दा है, लेकिन यह केवल एक ही संभावना है और उस मामले के लिए, एक स्वीकार किए गए उत्तर (पैराग्राफ 4) में सुझाए गए अपने पहले संस्करण के बाद से :-)
paxdiablo

6

Pyc फाइल को एक विंडो मशीन पर ले जाएं। इस pyc फ़ाइल को खोलने के लिए किसी भी Hex संपादक का उपयोग करें। मैंने फ्रीवेयर 'HexEdit' का इस्तेमाल किया। अब पहले दो बाइट्स का हेक्स मान पढ़ें। मेरे मामले में, ये 03 एफ 3 थे।

हेक्स और डेसीमल रूपांतरण को देखने के लिए कैल्क और अपने डिस्प्ले मोड को प्रोग्रामर (XP में वैज्ञानिक) में खोलें। रेडियो बटन से "हेक्स" चुनें। दूसरे बाइट के रूप में मान दर्ज करें और फिर पहला बाइट यानी f303 अब "Dec" (दशमलव) रेडियो बटन पर क्लिक करें। प्रदर्शित मूल्य वह है जो अजगर के जादू नंबर उर्फ ​​संस्करण के अनुरूप है।

तो, पहले उत्तर में प्रदान की गई तालिका पर विचार करें

  • 1.5 => 20121 => 4E99 इसलिए फ़ाइलों में 99 के रूप में पहली बाइट होगी और 4e के रूप में दूसरी
  • 1.6 => 50428 => C4FC इसलिए फ़ाइलों में पहला बाइट fc और दूसरा c4 होगा

2

"खराब मैजिक नंबर" त्रुटि भी होती है यदि आपने मैन्युअल रूप से अपनी फ़ाइल को एक्सटेंशन .pyc के साथ नामित किया है


1

मेरे पास बहुत पुराने (1.5.2) कार्यान्वयन का उपयोग करते हुए खराब मैजिक नंबर त्रुटि का एक अजीब मामला था। मैंने एक .pyo फ़ाइल उत्पन्न की और जिससे त्रुटि उत्पन्न हो गई। विचित्र रूप से, मॉड्यूल का नाम बदलकर समस्या को हल किया गया था। अपमानजनक नाम sms.py था। यदि मैंने उस मॉड्यूल से एक sms.pyo उत्पन्न किया, तो खराब मैजिक नंबर त्रुटि का परिणाम था। जब मैंने नाम को smst.py में बदल दिया, तो त्रुटि चली गई। मैंने यह देखने के लिए आगे और पीछे की जाँच की कि क्या sms.py किसी तरह एक ही नाम के साथ किसी अन्य मॉड्यूल के साथ हस्तक्षेप करता है लेकिन मुझे कोई नाम टक्कर नहीं मिली। भले ही इस समस्या का स्रोत मेरे लिए एक मुश्किल था, लेकिन मैं एक मॉड्यूल नाम परिवर्तन की कोशिश करने की सलाह देता हूं।


1

यह __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'


0

यह ऊपर की तुलना में बहुत अधिक प्रभावशाली है।

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

{directory-of-.pyc-files}वह निर्देशिका कहां है जिसमें संकलित अजगर फाइलें सम्‍मिलित हैं।


1
यदि आपके पास हाथ पर पाई फाइलें हैं, तो यदि आपको अजगर की स्थापना को डाउनग्रेड करने की आवश्यकता नहीं है।
लियोन फेडोटोव

1
कुछ बढ़त के मामलों के लिए यह अभी भी असुरक्षित है। जब हम फ़ाइलों के बारे में बात कर रहे हैं, तब भी हम पुनरावर्ती डिलीट क्यों कर रहे हैं?
जेरोम बॉम

1
आप दो प्रक्रियाओं का उपयोग क्यों कर रहे हैं? यहां तक ​​कि अगर खोज को हटा नहीं दिया गया है, तो आप अभी भी चला सकते हैंfind /dir -name "*.pyc" -exec rm '{}' ';'
mikemaccana

1
यदि 'डिफॉल्ट -प्रिंट फाइनल ऑपरेटर' को सीधे xargs rm द्वारा प्रयोग किया जाता है, तो 'फाइंड' कमांड स्पेस के साथ फाइलनाम के लिए सुरक्षित रूप से काम नहीं करेगा। पायथन इस तरह से नामांकित गैर-पहचानकर्ता फ़ाइलों का आयात नहीं करता है, लेकिन स्क्रिप्ट अभी भी इसे तोड़ने का कारण बन सकती हैं और उन्हें हटाया नहीं जाएगा। आम तौर पर हमेशा एक अतिरिक्त -00 (अंत पर शून्य) का उपयोग करने के लिए सुरक्षित पाते हैं कमांड पर (अंतिम पैरामीटर से पहले '|' पाइप सिंबल) और फिर -0 विकल्प xargs (यानी एक हाइफ़न + शून्य) को समझने के लिए - rm कमांड से पहले print0 आउटपुट, जब पाइपिंग xargs में मिलती है।
ब्रीजर

0

मेरे मामले में मेरे अपने मॉड्यूल का नाम बदलने के बाद यह .pycपुरानी बाइनरी .moअनुवाद फाइलें नहीं थी , इसलिए इस मॉड्यूल फ़ोल्डर के अंदर मुझे दौड़ना पड़ा

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

(कृपया बैकअप करें और .pycपहले फ़ाइलों को ठीक करने का प्रयास करें )


0

यह तब भी हो सकता है यदि आपके पास गलत python27.dll फ़ाइल है (विंडोज के मामले में), इसे ठीक इसी dll संस्करण के साथ इसे फिर से स्थापित (या निकालने) अजगर को हल करने के लिए। मुझे एक ऐसा ही अनुभव हुआ था।


0

मुझे बस फेडोरा26 के साथ इसी मुद्दे का सामना करना पड़ा जहां छह के लिए खराब मैजिक नंबर के कारण डीएनएफ जैसे कई उपकरण टूट गए थे। किसी अज्ञात कारण से मुझे अप्रत्याशित मैजिक नंबर के साथ एक फ़ाइल /usr/bin/six.pyc मिली है। इस फ़ाइल को हटाने से समस्या ठीक हो जाती है


0

मेरे मामले में, मेरा git cloneएक परिवाद है जिसमें एक दुभाषिया था

#!/usr/bin/env python

जबकि pythonकरने के लिए ले जा रहा था Python2.7, भले ही अपने मुख्य कोड python3.6 के साथ चल रहा था ... यह अभी भी एक बनाया *.pycके लिए फ़ाइल 2.7संस्करण ...

मैं कह सकता हूं कि यह त्रुटि संभवतः 2.7 और 3+ संस्करणों के बीच एक मिश्रण का परिणाम है, यही कारण है कि सफाई (किसी भी तरह से आप सोच सकते हैं कि आप उपयोग कर रहे हैं) - यहां मदद मिलेगी ...

  • उन Python2x कोड को समायोजित करने के लिए मत भूलना -> अजगर 3 ...

-1

उन्हें नष्ट मत करो !!! इस समय तक ..........

अपने git, svn या कॉपी फ़ोल्डर पर एक संस्करण खोजें जो काम करता है।

उन्हें हटा दें और फिर सभी को पुनर्प्राप्त करें .pyc

मेरे लिए यही काम है।


आई क्यों मैं -1 है? यह वास्तव में मेरे लिए काम करता है और मैं वास्तव में खराब स्थिति में था
ac

2
पिछले संस्करण पर वापस लौटना एक वैश्विक समाधान नहीं है
ZiTAL

4
आप कभी अपनी *.pycफ़ाइलों को क्यों करेंगे ?
मानोस कोनेलैकिस

यह सामान्य त्रुटि है। जब आप git अनदेखा फ़ाइल को सही ढंग से कॉन्फ़िगर नहीं करते हैं। तो मैं समाधान देता हूं और फिर आपको अपना आदेश देना चाहिए।
लौरलकर्रा

-1

आपको अपने वातावरण में हर तरह से इस कमांड को चलाना होगा।

>>> 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...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.