.Pyc ফাইলগুলি কখন রিফ্রেশ হয়?


92

আমি বুঝতে পারি যে ".pyc" ফাইলগুলি প্রোগ্রামগুলি দ্রুত চালিত করার জন্য রানটাইম সময়ে তৈরি প্লেইন-পাঠ্য ".py" ফাইলগুলির সংস্করণ সংকলিত are তবে আমি কয়েকটি বিষয় পর্যবেক্ষণ করেছি:

  1. "পাই" ফাইলগুলি পরিবর্তন করার পরে, প্রোগ্রামের আচরণের পরিবর্তন হয়। এটি ইঙ্গিত করে যে "পাই" ফাইলগুলি সংকলিত হয়েছে বা কমপক্ষে কিছু প্রকারের হ্যাশিং প্রক্রিয়া হওয়া বা টাইম স্ট্যাম্পগুলির সাথে তুলনা করে পুনরায় সংকলন করা উচিত কিনা তা জানাতে চলে।
  2. সমস্ত ".pyc" ফাইল ( rm *.pyc) মুছে ফেলার পরে কখনও কখনও প্রোগ্রামের আচরণের পরিবর্তন হবে। যা ইঙ্গিত দেয় যে তারা ".py" এর আপডেটে সংকলন করা হচ্ছে না।

প্রশ্নসমূহ:

  • তারা কীভাবে সংকলন করতে হবে তা স্থির করবেন?
  • উন্নয়নের সময় তাদের কঠোর চেকিং রয়েছে কিনা তা নিশ্চিত করার কোনও উপায় আছে?

15
এর সাথে .pyc ফাইলগুলি মুছে ফেলার বিষয়ে সাবধান থাকুন rm *.pyc। এটি নেস্টেড ফোল্ডারে .pyc ফাইলগুলি মুছবে না। find . -name '*.pyc' -deleteপরিবর্তে ব্যবহার করুন
জাগস

6
আপনার প্রশ্নের সম্ভবত একটি নোট: একটি '.pyc' বা '.pyo' ফাইল থেকে '.py' ফাইল থেকে পড়ার চেয়ে কোনও প্রোগ্রাম দ্রুততর হয় না; '.pyc' বা '.pyo' ফাইলগুলির সম্পর্কে দ্রুত যা কেবল সেগুলিই লোড হয় speed লিঙ্ক
ম্যাগি

@ ম্যাগজি লোডিং এবং এক্সিকিউশন সময়ের মধ্যে পার্থক্য কী?
ড্যানিয়েল স্প্রিংগার

4
@ ডানি লোডিংটি প্রোগ্রামটি পড়তে এবং তারপরে সংকলন করতে সময় লাগে। কার্যকর করার সময়টি যখন প্রোগ্রামটি আসলে চালিত হয় যা লোড হওয়ার পরে ঘটে। আপনি যদি প্রযুক্তিগত হতে চান তবে সময়ের প্রকারগুলি হ'ল লোড সময়, সংকলন সময়, লিঙ্ক সময়, এবং সম্পাদনের সময়। একটি .পিসি তৈরি করা সংকলনের সময়ের অংশটিকে সরিয়ে দেয়।
এরিক ক্লিন

@ এরিককলিয়ান ধন্যবাদ মানুষ
ড্যানিয়েল স্প্রিংগার

উত্তর:


81

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

"কঠোর চেকিং" বলতে কী বোঝ?


4
আমি সমস্যাগুলি সমাধান করতে সক্ষম rm *.pyc। আমি জানি যে আমি যদি সমস্ত ফাইল পুনরায় তৈরি করতে বাধ্য করি তবে কিছু সমস্যা স্থির হয়েছে, ইঙ্গিত করে যে ফাইলগুলি নিজেরাই পুনরায় সংকলন করছে না। আমি মনে করি তারা যদি টাইমস্ট্যাম্পগুলি ব্যবহার করে তবে এই আচরণটি আরও কঠোর করার কোনও উপায় নেই তবে সমস্যাটি এখনও অব্যাহত রয়েছে।
অ্যারন শিফ

14
এই পুরোপুরি সঠিক নয়। টাইমস্ট্যাম্পগুলির সাথে মিলের প্রয়োজন নেই (এবং এগুলি সাধারণত হয় না)। .pycএর টাইমস্ট্যাম্প হতে হবে পুরোনো সংশ্লিষ্ট চেয়ে .pyএকটি কম্পায়লেশান ট্রিগার গুলি টাইমস্ট্যাম্প।
টিম পিটজ্যাকার

4
অ্যারোন, আপনি সম্ভবত .py ফাইলগুলি পরিবর্তন করছেন এবং তাদের আরও বয়স্ক করে তোলার প্রক্রিয়াতে (উদাহরণস্বরূপ, অন্য ডিয়ার থেকে অনুলিপি করে, এমন একটি অপারেশন ব্যবহার করছেন যা 'পরিবর্তনের সময়টি সংরক্ষণ করে')?
গ্রেগগো

4
@ গ্রেগগো, আমি গিট ব্যবহার করছি এবং একটি সংগ্রহশালা থেকে আপডেট করছি, তাই হ্যাঁ আমি একভাবে আছি। এটা এটা করতে পারে। ধন্যবাদ
অ্যারন শিফ

4
জানা ভাল. আপনার উত্তরটি কীভাবে সংশোধন করবেন?
পাইওটর ডব্রোগস্ট

31

যখনই সম্পর্কিত কোড উপাদানগুলি আমদানি করা হয় তখনই .pyc ফাইলগুলি উত্পন্ন হয় এবং যদি সম্পর্কিত কোড ফাইলগুলি আপডেট করা থাকে তবে আপডেট হয়। .Pyc ফাইলগুলি মুছে ফেলা হলে সেগুলি স্বয়ংক্রিয়ভাবে পুনরায় জেনারেট হবে। তবে, সংশ্লিষ্ট কোড ফাইলগুলি মুছে ফেলা হলে সেগুলি স্বয়ংক্রিয়ভাবে মোছা হয় না

এটি ফাইল-স্তরের রিফ্যাক্টরগুলির সময় কিছু সত্যই মজাদার বাগের কারণ হতে পারে।

প্রথমত, আপনি পুশিং কোডটি শেষ করতে পারেন যা কেবলমাত্র আপনার মেশিনে এবং কারওরই কাজ করে না। আপনি মুছে ফেলা ফাইলগুলির কাছে যদি ঝুঁকির রেফারেন্স থাকে তবে আপনি যদি প্রাসঙ্গিক .pyc ফাইলগুলি ম্যানুয়ালি মুছে না ফেলেন তবে এগুলি স্থানীয়ভাবে কাজ করবে কারণ .pyc ফাইলগুলি আমদানিতে ব্যবহার করা যেতে পারে। এটি এই বিষয়টির সাথে আরও জোরালো যে একটি সঠিকভাবে কনফিগার করা সংস্করণ নিয়ন্ত্রণ ব্যবস্থা কেবলমাত্র .PY ফাইলগুলিকে কেন্দ্রীয় ভান্ডারে ঠেকিয়ে দেবে, .pyc ফাইল নয়, এর অর্থ হল যে আপনার কোড "আমদানি পরীক্ষা" পাস করতে পারে (সবকিছু ঠিক আছে আমদানি করে) ঠিক আছে এবং না অন্য কারও কম্পিউটারে কাজ।

দ্বিতীয়ত, আপনি যদি প্যাকেজগুলিকে মডিউলগুলিতে পরিণত করেন তবে আপনার কয়েকটি দুর্দান্ত ভয়ঙ্কর বাগ থাকতে পারে। আপনি যখন কোনও প্যাকেজ (কোনও __init__.pyফাইলের ফোল্ডার ) একটি মডিউলে রূপান্তর করেন (a .py ফাইল), সেই প্যাকেজটিকে একবার উপস্থাপন করে .pyc ফাইলগুলি রয়ে যায়। বিশেষত, __init__.pycঅবশেষ। সুতরাং, যদি আপনার কাছে কিছু কোডের সাথে প্যাকেজ ফু থাকে তবে কিছু def bar(): passযায় আসে না, তবে পরে সেই প্যাকেজটি মুছুন এবং কিছু ফাংশন দিয়ে একটি ফাইল foo.py তৈরি করুন এবং রান করুন:

from foo import bar

তুমি পাও:

ImportError: cannot import name bar

কারণ পাইথন এখনও foo প্যাকেজ থেকে পুরানো .pyc ফাইলগুলি ব্যবহার করছে, যার কোনটিই বারটিকে সংজ্ঞায়িত করে না। এটি একটি ওয়েব সার্ভারে বিশেষত সমস্যাযুক্ত হতে পারে, যেখানে সম্পূর্ণরূপে কার্যকারী কোডটি .pyc ফাইলগুলির কারণে ভেঙে যেতে পারে।

এই উভয় কারণে (এবং সম্ভবত অন্যদের) ফলস্বরূপ, আপনার ডিপ্লোয়মেন্ট কোড এবং পরীক্ষার কোডটি .pyc ফাইলগুলি মুছে ফেলা উচিত, যেমন নীচের ব্যাশের লাইনের সাথে:

find . -name '*.pyc' -delete

এছাড়াও, পাইথন ২.6 হিসাবে, আপনি -B.pyc ফাইলগুলি ব্যবহার না করার জন্য পতাকা সহ পাইথন চালাতে পারেন । .Pyc ফাইলগুলি এড়াতে কীভাবে দেখুন ? আরো বিস্তারিত জানার জন্য.

আরও দেখুন: আমি কীভাবে কোনও প্রকল্প থেকে সমস্ত .pyc ফাইলগুলি সরিয়ে দেব?


"আপনি যখন কোনও মডিউল রূপান্তর করেন (কোনও __init__.pyফাইলের সাথে একটি ফোল্ডার) ..."। এটি একটি প্যাকেজ হবে, মডিউল নয়।
রবার্ট ডেভিড গ্রান্ট

4
বিশেষত, __init__.pycঅবশেষ। - কিভাবে? যেহেতু একটি প্যাকেজ একটি ডিরেক্টরি একটি প্যাকেজ মোছার অর্থ ডিরেক্টরি মুছে ফেলা হয় সুতরাং কোনও ফাইল নেই…
পাইট্র ডবরোগস্ট

4
@ পাইওটারডব্রোগস্ট সঠিকভাবে পরিচালিত উত্স নিয়ন্ত্রণে আপনার পিআইসি ফাইলগুলিকে উত্স হিসাবে পরীক্ষা না করা জড়িত। সুতরাং আপনি যখন নিজের স্থানীয় অনুলিপিতে পাইক ফাইলগুলি সহ ফোল্ডারটি মুছতে পারেন, অন্য কোনও ব্যক্তি যারা গিট টানছেন তাদের পক্ষে এটি মুছা হবে না। এটি আপনার সার্ভার ক্র্যাশ করতে পারে যদি আপনার মোতায়েনের সাথে গিট টানও জড়িত থাকে।
জাগস

আপনার কোডটি কোথায় স্থাপন করা হবে তার প্রতিনিধি হওয়ার জন্য আপনার দেব পরিবেশকে বিশ্বাস না করার অনেকগুলি কারণ রয়েছে। এই .pycসমস্যাটিরও একটি কারণ হ'ল: ওএস এবং ইউটিলিটি প্যাচ স্তরগুলি, .soফাইলগুলি, কনফিগারেশন ফাইলগুলি, অন্যান্য পাইথন লিবসের উপর লুকানো নির্ভরতা (যদি আপনি ভার্চুয়াল এনভিটিতে চালিত না হন), অস্পষ্ট এনভ ভার্স ... তালিকাটি এগিয়ে যায়। এই জাতীয় সমস্যাগুলি পুরোপুরিভাবে সন্ধান করতে এবং খুঁজে পেতে আপনার গিট রেপোতে আপনার কোডের একটি পরিষ্কার কপি তৈরি করতে হবে বা একটি পাইপিআই শৈলীর সার্ভারে প্যাকেজ হিসাবে প্রকাশ করতে হবে এবং একটি নতুন ক্লায়েন্ট বা একটি নতুন ভিএম-তে সেটআপ করা উচিত। সেই সম্ভাব্য সমস্যাগুলির কয়েকটি .pycতুলনায় তুলনামূলকভাবে এই সমস্যাটিকে বিবর্ণ করে তোলে ।
ক্রিস জনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.