__Pycache__ কি?


651

আমি যা বুঝতে পারি তা থেকে, ক্যাশে অনুরূপ ফাইলগুলির একটি এনক্রিপ্ট করা ফাইল।

আমরা __pycache__ফোল্ডারটি দিয়ে কী করব ? এটি কি আমাদের উত্স কোডের পরিবর্তে আমরা লোকদেরকে দিই? এটি কি কেবল আমার ইনপুট ডেটা? এই ফোল্ডারটি তৈরি হতে থাকে, এটি কীসের জন্য?


29
"আমরা কি আমাদের উত্স কোডের পরিবর্তে মানুষকে দিই?" - না, আপনি তাদের ইনস্টলযোগ্য প্যাকেজে উত্স কোড দিন যাতে এটি ব্যবহার করা সহজ।
লেনার্ট রেজেব্রো

79
এখনও কেউ উল্লেখ করেনি, তবে আপনার ক্যাশে সংজ্ঞাটি উদ্ভট। ক্যাশে বেশ সহজেই এমন একটি উপাদান যা ডেটা সঞ্চয় করে তাই ভবিষ্যতে সেই ডেটার জন্য অনুরোধগুলি দ্রুত পরিবেশন করা যায়
রিকার্ডো ক্রুজ


1
যেহেতু Python 3.8আপনাকে একটি পরিবেশ ভেরিয়েবল ব্যবহার করতে পারেন অবস্থান পরিবর্তন : বিরক্তিকর ক্যাশে ডিরেক্টরিগুলি জন্য stackoverflow.com/a/57414308/1612318
Rotareti

ক্যাশে এমন একটি জিনিস যা আপনার আবার প্রয়োজন হলে স্টাফের অনুলিপি রাখে, এটি পাওয়ার জন্য আপনাকে মূলটিতে ফিরে যেতে বাঁচাতে। এটি মূল জায়গায় যাওয়ার চেয়ে দ্রুত হওয়ার জন্য ডিজাইন করা হয়েছে। এটি দ্রুত হতে পারে কারণ এর প্রাক-প্রক্রিয়া বা তথ্য সংকলন করতে হবে না। বা এটি দ্রুত স্টোরেজ হতে পারে, যেমন র‍্যামে একটি ডিস্ক ক্যাশে বা স্থানীয় ডিস্কে একটি ওয়েব ক্যাশে। এটি প্রকৃতির দ্বারা এনক্রিপ্ট করা নয় (যদিও এটি কখনও কখনও হতে পারে), এবং এটি সর্বদা একটি "অনুরূপ ফাইলগুলির ফাইল" নয় - এটি কোনও ফাইল, ফাইলের বোঝা, র‌্যামের একটি ব্লক ইত্যাদি হতে পারে
rjmunro

উত্তর:


518

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

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

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

python -B foo.py

Tcaswell দ্বারা উল্লিখিত অন্য একটি বিকল্প হ'ল পরিবেশকে PYTHONDONTWRITEBYTECODEযেকোন মূল্যের সাথে পরিবর্তনশীল সেট করা (পাইথনের ম্যান পৃষ্ঠা অনুসারে, কোনও "খালি নয়" স্ট্রিং)।


48
PYTHONDONTWRITEBYTECODE=<any_value>স্থায়ীভাবে দমন করতে আপনি পরিবেশের পরিবর্তনশীলও যুক্ত করতে পারেন ।
মার্ক টোলোনেন

11
কেবল পরিষ্কার করতে, এটি পাইথন 3 এর জন্যই, সঠিক?
জো জে

11
@ জোজে হ্যাঁ, আমি মনে করি এটি সত্য। python2সংকলিত ফাইলগুলি একই ডিরেক্টরিতে মূল হিসাবে রাখে, যদি আমার ভুল না হয়।
স্কট_ফ্যাকেনাম

27
একটি গুরুত্বপূর্ণ ক্যাভিয়েট হ'ল .py ফাইলটি অনুপস্থিত থাকলে ক্যাপিড .pyc ফাইলটি .py ফাইলের পরিবর্তে ব্যবহৃত হবে। অনুশীলনে, এটি কেবল তখনই ঘটে যখন আপনি মডিউলগুলি মুছে ফেলেন (বা নাম পরিবর্তন করুন), তাই এটি কোনও সাধারণ ঘটনা নয়, তবে কিছু জিনিস যদি আপনার মাথা আঁচড়ানোর পরে, চালানো সন্ধানের পরে "সেখানে" থাকে। -নাম * .পিসি | আপনার উত্সে xargs আরএম সম্ভবত একটি ভাল প্রথম প্রতিক্রিয়া।
yacc143

34
find . -name '*.pyc' -deleteহ্যাঁ, সন্ধান করা ফাইলগুলি মুছে ফেলার জন্য একটি পতাকা রয়েছে, সুতরাং আপনাকে কোনও xargs শানানিগান ব্যবহার করতে হবে না
vlad-ardelean

174

__pycache__পাইথন 3 বাইটকোডযুক্ত একটি ফোল্ডারটি সংকলিত এবং কার্যকর করার জন্য প্রস্তুত

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

পাইথন প্রোগ্রামাররা সাধারণত বাইটকোড উপেক্ষা করে। প্রকৃতপক্ষে __pycache__এবং ফাইলগুলিতে *.pycদেখতে সাধারণ লাইন .gitignore। বাইটকোড বিতরণের জন্য নয় এবং disমডিউলটি ব্যবহার করে বিচ্ছিন্ন করা যেতে পারে ।


আপনি যদি ওএস এক্স ব্যবহার করে থাকেন তবে আপনি সহজেই আপনার প্রকল্পের মূল ফোল্ডার থেকে নিম্নলিখিত কমান্ডটি চালিয়ে আপনার প্রকল্পে এই সমস্ত ফোল্ডারগুলি সহজেই আড়াল করতে পারেন।

find . -name '__pycache__' -exec chflags hidden {} \;

পাইথন 2 এর __pycache__সাথে প্রতিস্থাপন করুন *.pyc

এটি সেই সমস্ত ডিরেক্টরিতে (.pyc ফাইলগুলি) ফাইন্ডার / টেক্সটমেট 2 কে তালিকাভুক্তি থেকে বাদ দেওয়ার জন্য একটি পতাকা সেট করে। গুরুত্বপূর্ণভাবে বাইকোডটি রয়েছে, এটি কেবল লুকানো।

আপনি যদি নতুন মডিউল তৈরি করেন এবং নতুন বাইকোড গোপন করতে চান বা লুকানো বাইটকোড ফাইলগুলি মুছে ফেলেন তবে কমান্ডটি পুনরায় চালু করুন।


উইন্ডোজ সমমানের কমান্ড হতে পারে (পরীক্ষিত নয়, ব্যাচ স্ক্রিপ্ট স্বাগত):

dir * /s/b | findstr __pycache__ | attrib +h +s +r

যা ডান-ক্লিক> গোপন ব্যবহার করে ফোল্ডারগুলি লুকিয়ে রেখে প্রকল্পের মধ্য দিয়ে যাবার মত ...


ইউনিট পরীক্ষা চালানো হ'ল একটি দৃশ্যে (মন্তব্যগুলিতে আরও বেশি) যেখানে *.pycফাইল এবং __pycache__ফোল্ডারগুলি মুছে ফেলা সত্যিই দরকারী। আমি আমার নীচের লাইনগুলি ব্যবহার করি ~/.bash_profileএবং clযখন প্রয়োজন হয় তখন পরিষ্কার করার জন্য চালাই ।

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

আপনি যখন কোডটি চালাবেন তখন কি এটি পূর্বাবস্থায় ফিরে যাবে না?
ফাঁকা

2
@ দোয়েভো: এটি কেবল তৈরি হয় না, সুতরাং পরবর্তী সময় মডিউলটি লোড হওয়ার পরে কোনও স্পিডআপ নেই। কোন ত্রুটি উত্থাপিত হয় না।
পেটর ভিক্টরিন

7
এটি একটি ভাল উত্তর নয়। প্রশ্নকারী এই ফাইলগুলি কীসের জন্য তা জানতে চান। এই উত্তরটি বলে "এটি সম্পর্কে চিন্তা করবেন না" এবং তারপরে সেগুলি অদৃশ্য হয়ে যায়।
আকর্ষণীয়ভাবে এখানে

36
একেবারে এই মোছার বিরক্ত : এটা অর্থহীন নয়। পাইথন খুশিতে ফাইলের পরিবর্তনগুলি সনাক্ত করতে পারবে না এবং অনেক পরিস্থিতিতে একটি ক্যাশে ফাইলটি চালিয়ে দেবে না, "এফ এখনও কাজ করে না কেন, আমি কোডটি পরিবর্তন করেছি, কেন এটি এখনও অস্তিত্বহীন কলগুলিতে ব্যর্থ হচ্ছে" বাজে কথা বলে the বিশেষত টেস্ট ফ্রেমওয়ার্কগুলিতে পাইচা-বাই-ডিফল্ট সবচেয়ে খারাপ।
মাইক 'পোম্যাক্স' কামারম্যানস

2
আমি "এই ফাইলগুলি মুছে ফেলার বিরক্ত করবেন না" - এই পরামর্শটির সাথে আমি একমত নই - বেশিরভাগ ক্ষেত্রেই এই সুপারিশটি দেখেছি, অতি সম্প্রতি কেনেথ রেইটসের "হা টু টু পাইথন" ("বাইটোকোড ট্রিক")
লুই ম্যাডডক্স

38

__pycache__আপনি যখন লাইনটি ব্যবহার করেন তখন একটি ফোল্ডার তৈরি করা হয়:

import file_name

অথবা আপনার তৈরি করা অন্য ফাইল থেকে তথ্য নেওয়ার চেষ্টা করুন। এটি দ্বিতীয় ফাইলটি খোলার জন্য দ্বিতীয়বার আপনার প্রোগ্রাম চালানোর সময় কিছুটা দ্রুত করে তোলে।


27

3.7+ ডক্স থেকে আপডেট উত্তর:

লোডিং মডিউলগুলির গতি বাড়ানোর জন্য পাইথন__pycache__ নামের অধীনে ডিরেক্টরিতে প্রতিটি মডিউলের সংকলিত সংস্করণটি ক্যাশে করেmodule.version.pyc , যেখানে সংস্করণটি সংকলিত ফাইলের বিন্যাসকে এনকোড করে; এটিতে পাইথন সংস্করণ নম্বর থাকে। উদাহরণস্বরূপ, সিপিথন রিলিজে ৩.৩ স্প্যাম.পাইয়ের সংকলিত সংস্করণ হিসাবে ক্যাশে হবে __pycache__/spam.cpython-33.pyc। এই নামকরণ কনভেনশনটি পাইথনের বিভিন্ন প্রকাশ এবং বিভিন্ন সংস্করণ থেকে সংকলিত মডিউলগুলিকে সহাবস্থান করতে দেয়।

সূত্র: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

অর্থাৎ, এই ডিরেক্টরিটি পাইথন দ্বারা তৈরি এবং আপনার প্রোগ্রামগুলি আরও দ্রুত চালিত করার জন্য বিদ্যমান to এটি উত্স নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ হওয়া উচিত নয় এবং আপনার স্থানীয় উত্স কোডের সাথে শান্তিতে সহাবস্থান করা উচিত।


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

পাইথন ডক্স এটি কীভাবে কাজ করে এবং কেন এটি বিদ্যমান তা সম্পর্কে আরও গভীরতার দিকে যায়:

  • এটি পাইথন ৩.২-এ যুক্ত করা হয়েছিল কারণ .pycএকই ডিরেক্টরিতে ফাইল রক্ষণাবেক্ষণের বিদ্যমান সিস্টেমের ফলে বিভিন্ন সমস্যার সৃষ্টি হয়েছিল, যেমন একটি প্রোগ্রাম যখন বিভিন্ন সংস্করণের পাইথন ইন্টারপ্রেটারদের সাথে চালিত হয়েছিল। সম্পূর্ণ বৈশিষ্ট্য বৈশিষ্ট্যের জন্য, পিইপি 3174 দেখুন

5

অফিসিয়াল পাইথন টিউটোরিয়াল মডিউলগুলি থেকে

লোডিং মডিউলগুলির গতি বাড়ানোর জন্য পাইথন __pycache__নামের অধীনে ডিরেক্টরিতে প্রতিটি মডিউলের সংকলিত সংস্করণটি ক্যাশে করে module.version.pyc, যেখানে সংস্করণটি সংকলিত ফাইলের বিন্যাসকে এনকোড করে; এটিতে পাইথন সংস্করণ নম্বর থাকে। উদাহরণস্বরূপ, সিপিথন রিলিজে 3.6 স্প্যাম.পাইয়ের সংকলিত সংস্করণ হিসাবে ক্যাশে হবে __pycache__/spam.cpython-36.pyc

পাইথন ডক প্রোগ্রামিং এফএকিউ থেকে

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


5

পাইথন স্ক্রিপ্ট কার্যকর করার ফলে বাইট কোডটি মেমরিতে জেনারেট হয়ে যায় এবং প্রোগ্রামটি বন্ধ না হওয়া পর্যন্ত রাখা হয়। যদি কোনও মডিউল আমদানি করা হয়, দ্রুত পুনঃব্যবহারের জন্য, পাইথন একটি ক্যাশে তৈরি করে c আইডিয়াটি হ'ল পাইথন মডিউলগুলি পুনরায়-আমদানি করার সময় পুনরায় সংকলন এড়িয়ে (একবার সংকলন করুন, একাধিকবার নীতি চালান) এড়ানো উচিত load

ফাইলটির নাম মডিউল নামের মতো। প্রাথমিক ডটের পরে অংশটি পাইথন বাস্তবায়ন নির্দেশ করে যা তার সংস্করণ সংখ্যাটি অনুসরণ করে ক্যাশে তৈরি করে (সিপিথন হতে পারে)।


3

পাইথন ইন্টারপ্রেটার * .py স্ক্রিপ্ট ফাইলটি সংকলন করে এবং সংকলনের ফলাফলগুলিতে সংরক্ষণ করে __pycache__ ডিরেক্টরিতে ।

প্রকল্পটি আবার সম্পাদন করা হলে, দোভাষী যদি * .py স্ক্রিপ্টটি পরিবর্তন করে না তা সনাক্ত করে, এটি সংকলন পদক্ষেপটি এড়িয়ে যায় এবং __pycache__ফোল্ডারে সঞ্চিত পূর্বে উত্পন্ন * .pyc ফাইলটি চালায় ।

যখন প্রকল্পটি জটিল হয়, আপনি প্রকল্পটি ছোট করার আগে প্রস্তুতির সময়টি তৈরি করতে পারেন। প্রোগ্রামটি যদি খুব ছোট python -B abc.pyহয় তবে Bবিকল্পটি ব্যবহার করে আপনি এটিকে উপেক্ষা করতে পারেন ।


3

দোভাষা কোডটি সংকলন করার সময় পাইথন সংস্করণ ২.x এর .pyc থাকবে ।

দোভাষী কোডটি সংকলন করার সময় পাইথন সংস্করণ ৩.x এর মধ্যে __pycache__ থাকবে ।

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

৩.২ এবং তারপরে পাইথন, ডিরেক্টরিতে __pycache__অবস্থিত একটি উপ-ডিরেক্টরিতে .pyc সংকলিত বাইট কোড ফাইলগুলি সংরক্ষণ করে যেখানে আপনার উত্স ফাইলগুলি ফাইল নাম দিয়ে থাকে যা সেগুলি তৈরি করে পাইথন সংস্করণ সনাক্ত করে (যেমন স্ক্রিপ্ট।


আমি কীভাবে " পাইচে " ফোল্ডার তৈরি করা এড়াতে পারি এবং সমস্ত .pyc কে .py ফাইলের মতো করা উচিত?
আশ্বানি

1

আপনি যখন একটি মডিউল আমদানি করেন ,

import file_name

পাইথন সংকলিত বাইকোড __pycache__ডিরেক্টরিতে সঞ্চয় করে যাতে ভবিষ্যতের আমদানিগুলি সরাসরি উত্সটি বিশ্লেষণ এবং সংকলন না করে সরাসরি এটি ব্যবহার করতে পারে।

এটি কেবল কোনও স্ক্রিপ্ট চালানোর জন্য করে না, কেবলমাত্র যখন কোনও ফাইল আমদানি করা হয়।

(পূর্ববর্তী সংস্করণগুলি .pyc ফাইল হিসাবে ক্যাশেড বাইটকোড সংরক্ষণ করার জন্য ব্যবহৃত হয়েছিল যা। ডিরেক্টরি ফাইল হিসাবে একই ডিরেক্টরিটি ছড়িয়ে দিয়েছিল, তবে পাইথন 3 থেকে শুরু করে এগুলি জিনিসকে আরও সুশোভিত করার জন্য একটি উপ-ডিরেক্টরিতে স্থানান্তরিত করা হয়েছিল))

পাইথনডন্টউইটবাইটেকোড ---> এটি যদি খালি খালি স্ট্রিংয়ে সেট করা থাকে তবে পাইথন উত্স মডিউলগুলির আমদানিতে .pyc ফাইলগুলি লেখার চেষ্টা করবে না। এটি -B বিকল্পটি নির্দিষ্ট করার সমতুল্য।

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