খারাপ ম্যাজিক নম্বর ত্রুটিটি কী?


320

পাইথনে "ব্যাড ম্যাজিক নম্বর" ইম্পোর্টেরিয়ার কী এবং আমি কীভাবে এটি ঠিক করব?

আমি অনলাইনে যে জিনিসটি সন্ধান করতে পারি তা কেবল এটিই সুপারিশ করে যা একটি .py -> .pyc ফাইল সংকলন করে এবং তারপরে অজগরটির ভুল সংস্করণ দিয়ে এটি ব্যবহার করার চেষ্টা করে। আমার ক্ষেত্রে যাইহোক, ফাইলটি কিছু সময় জরিমানা আমদানি করে বলে মনে হয় তবে অন্যদের নয় এবং কেন তা আমি নিশ্চিত নই।

ট্রাইব্যাকটিতে অজগর যে তথ্য সরবরাহ করে তা বিশেষভাবে কার্যকর নয় (যার কারণেই আমি এখানে জিজ্ঞাসা করছিলাম ...), তবে এখানে এটির ক্ষেত্রে এটি সহায়তা করে:

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

আপনি যে কোডটিতে সমস্যাটি দেখা যাচ্ছে তা সরবরাহ করতে পারবেন?
ইভান ফসমার্ক

এবং অজগরটির কোন সংস্করণ আপনি ব্যবহার করছেন?
paxdiablo

এবং নরমালাইজেশন কি আপনার ফাইলগুলির মধ্যে একটি বা তৃতীয় পক্ষের একটি?
paxdiablo

3
এইচআরএম, ঠিক আছে, আমি মনে করি আমি যখনই .py ফাইলটি সরিয়ে নিয়েছিলাম তখন অবশ্যই আমি একটি পুরানো .pyc ফাইল আমদানি করেছিলাম এবং তাই আমি নতুন সংস্করণটি আমদানি করতে পারি তবে পুরানোটি নয়।
নোয়া

1
আমি পুরানো। পিসিপি ফাইলটি অক্ষরেখায় ফেলেছি, সুতরাং এটি আমার হাতে লাগেনি, তবে আমার সমস্যাটি ছিল আমদানির পথগুলির সাথে - আমি মনে করি পাইথ ফাইলটি সরানো না থাকলে। পাইপ ফাইলটি পুনরায় তৈরি করতে পাইপথনটি ব্যবহার করা হত I (ঠিক আছে?)
নূহ

উত্তর:


400

ম্যাজিক নম্বরটি ইউনিক্স-টাইপ সিস্টেম থেকে আসে যেখানে কোনও ফাইলের প্রথম কয়েকটি বাইট ফাইলের ধরণের নির্দেশক হিসাবে চিহ্নিত করে held

পাইথন pycএটি তৈরি করার সময় তার ফাইলগুলিতে অনুরূপ চিহ্নিতকারী রাখে ।

তারপরে পাইথন ইন্টারপ্রেটার লোড করার সময় এই সংখ্যাটি সঠিক কিনা তা নিশ্চিত করে।

এই যাদু সংখ্যার ক্ষতি করে এমন কোনও কিছুই আপনার সমস্যার কারণ হতে পারে। এর মধ্যে pycফাইল সম্পাদনা করা বা একটি চালানোর চেষ্টা করা অন্তর্ভুক্তpyc আপনার দোভাষীর চেয়ে পাইথনের ভিন্ন সংস্করণ (সাধারণত পরে) থেকে ।

যদি সেগুলি আপনার pyc ফাইল হয় তবে কেবল এগুলি মুছুন এবং দোভাষীকে pyফাইলগুলি পুনরায় সংকলন করতে দিন। ইউনিক্স টাইপ সিস্টেমে এটি এত সহজ কিছু হতে পারে:

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
ধন্যবাদ - এটি আমার সমস্যাটি সনাক্ত করতে আমাকে সরাসরি সহায়তা করতে পারেনি, তবে যাইহোক উত্তরটি জেনে ভাল লাগছে!
নোহ

কী পিআইসি ফাইলের কারণে সমস্যাটি হয় তা আমি কীভাবে চেক করতে পারি, আমি সমস্ত পাইক ফাইলগুলি মুছে ফেলেছি তবে এখনও এই ত্রুটিটি পেয়েছি।
সানপ্রোফিট

সম্ভবত আপনার এখন 'rm __pycache __ / * pyc' দরকার, কারণ পাইক ফাইলগুলি এখন সেই ফোল্ডারে রয়েছে।
অর্পদ হরভথ

1
ধন্যবাদ! এটি আমার সাথে ঘটেছিল: এররর: টর্নেডো.জেনারাল: 'এস' এর জন্য অনুবাদ লোড করা যায় না: [এর্নো 0] খারাপ যাদু নম্বর: '/ অ্যাপ্লিকেশন / লোকালে / ইএস / এলসি_ম্যাসেজেস / ডিজেঙ্গো.মো'। আসলে, এটি ছিল যে * .mo সঠিকভাবে সংকলিত হয়নি।
এরিকসন.সেপদা

1
এখানে আরও বিস্তৃত তালিকা: github.com/google/pytype/blob/master/pytype/pyc/magic.py
ডেভি

60

সমস্ত .pyc ফাইলগুলি মোছা "খারাপ ম্যাজিক নম্বর" ত্রুটি ঠিক করবে।

find . -name "*.pyc" -delete

8
এটি ব্যবহার করা সম্ভবত আরও ভাল find . -name "*.pyc" -delete, কারণ আপনার যদি সমস্ত ফাইলের নামটি পাস করার জন্য প্রসারিত করে তবে স্পেসগুলির সাথে সমস্যাগুলি (এবং সম্ভবত খুব দীর্ঘ একটি কমান্ড লাইন সহ) থাকবে rm
অ্যান্ড্রু আইলেট

25
আইএমও বেশ বিপজ্জনক স্ক্রিপ্ট দেয়। যদি কোনও প্যাকেজটি কেবল উত্স ফাইলটি বন্ধ রাখার জন্য .pyc ফাইলগুলি দিয়ে দেওয়া হয়? ওহো, আপনি কেবল অ্যাপ্লিকেশনটি মুছলেন।
ড্যান মান্তিলা

3
সম্ভবত প্রথমে চালানো ভাল find . -name "*.pyc" -printএবং তারপরে হয় সমস্যাযুক্ত ফাইলগুলি ম্যানুয়ালি মুছে ফেলুন এবং / অথবা উপরের কমান্ডটি চালান, যাচাই করার পরে আপনি কোনও অনুশোচনাযোগ্য কাজ করছেন না।
মাইকেল

9
@ ড্যানম্যান্টাইলা বন্ধ উত্স প্যাকেজগুলি যাইহোক মুছে ফেলার উপযুক্ত।
বিড়াল

25

পাইথন 2 *.pycদিয়ে পাইথন 3 উত্পন্ন ফাইল লোড করাও এই ত্রুটির কারণ হয়ে দাঁড়ায়।


3
এটি কোনও মন্তব্য হতে পারে, উত্তর নয়।
Kroltan

2
@ ক্রল্টান এখনও উত্তর হিসাবে এটি জঘন্য, গ্রহণীকৃতটির চেয়ে ভাল। সংক্ষিপ্ত এবং পয়েন্ট।
অ্যান্টনি হ্যাচকিনস 6:56

@ অ্যান্টনিহ্যাচকিনস কমপক্ষে আমার মতে, এটি .pyc মুছে ফেলার প্রস্তাব দেওয়া উত্তরের যে কোনও একটি মন্তব্য হতে পারে। যদিও এটি একটি সম্ভাব্য কারণ , এর কোনও আলাদা সমাধান নেই , তাই এটি অনর্থক। অসমত নির্দ্বিধায়, আমার মতামত।
Kroltan

@ ক্রোলটান 'কীভাবে ঠিক করবেন' অংশটি এখানে বেশ স্পষ্ট। কারণ, এটি আসলেই আকর্ষণীয় - আমার পক্ষে অন্তত -। আমি বিভিন্ন অজগর ২.x সংস্করণ দিয়ে প্রচুর ম্যাংলিং করেছি এবং কখনও কখনও .pyc সংস্করণগুলির মধ্যে কোনও অসুবিধাগুলির মুখোমুখি হইনি। এবং এই সমাধানটি বলে যে এটি পাইথন 3 বনাম পাইথন 2 সমস্যা - গৃহীত উত্তরের জন্য তথ্য অনুপস্থিত। প্লাস আমি সংক্ষিপ্ত উত্তর পছন্দ করি (যেখানে সম্ভব) :)
অ্যান্টনি হ্যাচকিনস

@ অ্যান্টনি হ্যাচকিনস, এই সমাধানটি ভালভাবে বলতে পারে এটি পাই 2/3 ইস্যু তবে এটি কেবল একটি সম্ভাবনা এবং এই বিষয়টির জন্য তার প্রথম সংস্করণ থেকে গ্রহণযোগ্য উত্তরে (অনুচ্ছেদ 4) পরামর্শ দেওয়া হয়েছে :-)
প্যাক্সিডাব্লো

6

উইন্ডো মেশিনে পাইক ফাইলটি নিয়ে যান। এই পাইক ফাইলটি খুলতে যে কোনও হেক্স সম্পাদককে ব্যবহার করুন। আমি ফ্রিওয়্যার 'হেক্সএডিট' ব্যবহার করেছি। এখন প্রথম দুটি বাইটের হেক্স মান পড়ুন। আমার ক্ষেত্রে, এগুলি ছিল 03 এফ 3।

হেক্স এবং দশমিক রূপান্তর দেখতে ক্যালক খুলুন এবং এর প্রদর্শন মোডটিকে প্রোগ্রামার (এক্সপি ইন সায়েন্টিফিক) এ রূপান্তর করুন। রেডিও বোতাম থেকে "হেক্স" নির্বাচন করুন। প্রথমে দ্বিতীয় বাইট হিসাবে মান লিখুন এবং তারপরে প্রথম বাইট অর্থাৎ f303 এখন "ডিসেম্বর" (দশমিক) রেডিও বোতামটি ক্লিক করুন। প্রদর্শিত মানটি যা পাইথনের যাদু নম্বর ওরফে সংস্করণের সাথে সামঞ্জস্যপূর্ণ।

সুতরাং, পূর্ববর্তী উত্তরে প্রদত্ত সারণিটি বিবেচনা করুন

  • 1.5 => 20121 => 4E99 সুতরাং ফাইলগুলির প্রথম বাইট 99 হিসাবে এবং দ্বিতীয়টি 4e হিসাবে হবে
  • 1.6 => 50428 => সি 4 এফসিএফ তাই ফাইলগুলির প্রথম বাইটটি এফসি হিসাবে এবং দ্বিতীয়টি সি 4 হিসাবে থাকবে

2

"খারাপ যাদু নম্বর" ত্রুটিটি ঘটলে যদি আপনি নিজের ফাইলটিকে একটি এক্সটেনশন .pyc দিয়ে ম্যানুয়ালি নাম দিয়ে থাকেন


1

আমার কাছে খুব পুরানো (১.২.২) বাস্তবায়নটি ব্যবহার করে ব্যাড ম্যাজিক নম্বর ত্রুটির একটি অদ্ভুত মামলা হয়েছে। আমি একটি .pyo ফাইল তৈরি করেছি এবং এটি ত্রুটিটিকে ট্রিগার করেছে। উদ্ভটভাবে, সমস্যাটি মডিউলটির নাম পরিবর্তন করে সমাধান করা হয়েছিল। আপত্তিজনক নাম sms.py. যদি আমি সেই মডিউলটি থেকে একটি এসএমএস.পিও তৈরি করি, তবে খারাপ ম্যাজিক নম্বর ত্রুটির ফলাফল ছিল। আমি নামটি যখন smst.py এ পরিবর্তন করেছি তখন ত্রুটিটি চলে গেছে। আমি পিছনে পিছনে চেক করে দেখলাম যে এসএমএস.পি কোনওভাবে একই নামের সাথে অন্য কোনও মডিউলটিতে হস্তক্ষেপ করেছে তবে আমি কোনও নাম সংঘর্ষের সন্ধান পেলাম না। যদিও এই সমস্যার উত্সটি আমার জন্য মিস্টি হিসাবে রয়ে গেছে, আমি একটি মডিউল নাম পরিবর্তনের চেষ্টা করার পরামর্শ দিই।


1

__init__.pyডিরেক্টরি থেকে ফাইল হারিয়ে যাওয়ার কারণে এটিও হতে পারে । বলুন যে আপনি ইউনিট পরীক্ষাগুলিকে একাধিক ফাইলগুলিতে পৃথক করার জন্য একটি নতুন ডিরেক্টরি তৈরি করেন এবং সেগুলি একটি ডিরেক্টরিতে রেখেছেন তবে আপনাকে __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 '{}' ';'
সন্ধানটি

1
ডিফল্ট -প্রিন্ট চূড়ান্ত অপারেটরটি সরাসরি xargs আরএম দ্বারা ব্যবহৃত হলে 'ফাইন্ড' কমান্ড স্পেস সহ ফাইলের নামগুলির জন্য নিরাপদে কাজ করবে না। পাইথন নন-আইডেন্টিফায়ারারের নামযুক্ত ফাইলগুলি আমদানি করে না, তবে স্ক্রিপ্টগুলি এখনও এটি ভেঙে দিতে পারে এবং সেগুলি মুছে ফেলা হবে না। সাধারণভাবে সর্বদা ফাইন্ড কমান্ডের অতিরিক্ত প্রিন্ট 0 (শেষে শূন্য) ব্যবহার করা নিরাপদ ('|' পাইপ প্রতীকের আগে শেষ প্যারামিটার হিসাবে) এবং তারপরে xargs- এ বিকল্প -0 বিকল্পটি (হাইফেন + শূণ্য) জানার জন্য - আরএম কমান্ডের আগে মুদ্রণ0 আউটপুট, যখন xargs মধ্যে পাইপিং করা হবে।
ব্রীজার

0

আমার ক্ষেত্রে এটি আমার নিজের মডিউলটির নতুন নামকরণের পরে .pycপুরানো বাইনারি .moঅনুবাদ ফাইলগুলি ছিল না , সুতরাং এই মডিউল ফোল্ডারের ভিতরে আমাকে চালাতে হয়েছিল

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

(দয়া করে ব্যাকআপ করুন এবং .pycপ্রথমে ফাইলগুলি ঠিক করার চেষ্টা করুন )


0

এটি ঠিক একই ডেল সংস্করণ সহ অজগরটিকে পুনরায় ইনস্টল (বা এক্সট্র্যাক্ট) সমাধান করার জন্য আপনার যদি ভুল পাইথন 27.ডিল ফাইল (উইন্ডোজ ক্ষেত্রে) থাকে তবে এটিও ঘটতে পারে। আমি একটি অনুরূপ অভিজ্ঞতা ছিল।


0

আমি ঠিক ফেডোরা 26 তে একই সমস্যার মুখোমুখি হয়েছি যেখানে ছয়জনের জন্য খারাপ যাদু সংখ্যার কারণে ডিএনএফ-এর মতো অনেক সরঞ্জাম ভেঙে গেছে। অজানা কারণে আমি অপ্রত্যাশিত যাদু নম্বর সহ একটি ফাইল /usr/bin/six.pyc পেয়েছি। এই ফাইলটি মুছে ফেলা সমস্যা সমাধান করুন


0

আমার ক্ষেত্রে, আমি git cloneএকটি lib যার একটি দোভাষী ছিল

#!/usr/bin/env python

যখন pythonনেতৃত্বে ছিলPython2.7 যদিও আমার মূল কোড python3.6 সঙ্গে চলমান ছিল ... এটা এখনও একটি নির্মিত *.pycফাইল 2.7সংস্করণ ...

আমি বলতে পারি যে এই ত্রুটিটি সম্ভবত 2.7 এবং 3+ সংস্করণের মধ্যে মিশ্রণের ফলস্বরূপ, এই কারণেই ক্লিনআপ (আপনি যেভাবে ব্যবহার করছেন তা ভাবতে পারেন) - এখানে সহায়তা করবে ...

  • এই পাইথন 2 এক্স কোডটি> অজগর 3 টি সামঞ্জস্য করতে ভুলবেন না ...

-1

এগুলি মুছবেন না !!! যতক্ষণ না ..........

আপনার গিট, এসএনএন বা অনুলিপি ফোল্ডারে কোনও সংস্করণ সন্ধান করুন যা কাজ করে।

এগুলি মুছুন এবং তারপরে সমস্ত .pyc পুনরুদ্ধার করুন।

এটা আমার জন্য কাজ।


হ্যাঁ আমার কেন -1 আছে? এটি সত্যই আমার পক্ষে কাজ করে এবং আমি সত্যিই খারাপ পরিস্থিতিতে
ছিলাম la

2
পূর্ববর্তী সংস্করণে ফিরে যাওয়া কোনও বিশ্বব্যাপী সমাধান নয়
জিটল

4
আপনি কখনই আপনার *.pycফাইলগুলি প্রতিশ্রুতিবদ্ধ করবেন?
মানস কাউনেলাকিস

এটাই স্বাভাবিক ত্রুটি। আপনি যখন গিট উপেক্ষা ফাইলটি সঠিকভাবে কনফিগার করবেন না। সুতরাং আমি সমাধানটি দেব এবং তারপরে আপনাকে অবশ্যই আপনার গিটটি অর্ডার করতে হবে।
লৌলালচর

-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...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.