উত্তর:
থেকে "কি নিউ পাইথন 2.6 মধ্যে - ইন্টারপ্রেটার পরিবর্তনসমূহ" :
পাইথনকে পাইথন ইন্টারপ্রেটার-- বি স্যুইচ সরবরাহ করে বা দোভাষা চালানোর আগে পাইথনডনট্রাইটবাইটিসিওডি এনভায়রনমেন্ট ভেরিয়েবল সেট করে পাইথন বা .pyo ফাইল লিখতে বাধা দেওয়া যেতে পারে । এই সেটিংটি পাইথন প্রোগ্রামগুলিতে
sys.dont_write_bytecode
ভেরিয়েবল হিসাবে উপলব্ধ এবং পাইথন কোড দোভাষীর আচরণ পরিবর্তন করতে মান পরিবর্তন করতে পারে।
2010-10-27 আপডেট করুন: পাইথন ৩.২ .pyc
ফাইলের সাথে বিশৃঙ্খলা উত্স ফোল্ডারগুলির একটি বিশেষ __pycache__
সাবফোল্ডার প্রবর্তন করে, পাইথন ৩.২-এ নতুন কী দেখুন - পিওয়াইসি সংগ্রহস্থল ডিরেক্টরিগুলি ।
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
সমস্ত স্ক্রিপ্টগুলিতে এটি প্রয়োগ করতে এটিতে এটি যুক্ত করুন। আমার জন্য, এই ডিরেক্টরি ছিল $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
। Cf. docs.python.org/2/tutorial/…
import sys; sys.dont_write_bytecode = True
পাইথন ২.৩++ তে এটি করার একটি উপায় আছে তবে এটি কিছুটা রহস্যজনক। আপনি এটি বুঝতে পেরেছেন কিনা তা আমি জানি না তবে আপনি নিম্নলিখিতগুলি করতে পারেন:
$ unzip -l /tmp/example.zip
Archive: /tmp/example.zip
Length Date Time Name
-------- ---- ---- ----
8467 11-26-02 22:30 jwzthreading.py
-------- -------
8467 1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
জিপিমপোর্ট লাইব্রেরি অনুসারে :
যে কোনও ফাইল জিপ সংরক্ষণাগারটিতে উপস্থিত থাকতে পারে তবে কেবলমাত্র .py এবং .py [co] ফাইল আমদানির জন্য উপলব্ধ। ডায়নামিক মডিউলগুলির জিপ আমদানি (.pyd, .so) অনুমোদিত নয়। মনে রাখবেন যে কোনও সংরক্ষণাগারটিতে কেবল .py ফাইল রয়েছে, পাইথন সংশ্লিষ্ট .pyc বা .pyo ফাইল যুক্ত করে সংরক্ষণাগারটি পরিবর্তন করার চেষ্টা করবে না, এর অর্থ হ'ল যদি কোনও জিপ সংরক্ষণাগারে .pyc ফাইলগুলি না থাকে, আমদানি বরং ধীর হতে পারে।
সুতরাং, আপনাকে যা করতে হবে তা হ'ল ফাইলগুলি জিপ আপ করতে হবে, আপনার সিএস.প্যাথের সাথে জিপফিল যুক্ত করুন এবং তারপরে সেগুলি আমদানি করুন।
আপনি যদি ইউনিক্সের জন্য এটি নির্মাণ করে থাকেন তবে আপনি এই রেসিপিটি ব্যবহার করে আপনার স্ক্রিপ্টটি প্যাকেজিংয়ের বিষয়টিও বিবেচনা করতে পারেন: ইউনিক্স জিপ এক্সিকিউটেবল , তবে নোট করুন যে আপনি স্টিডিন ব্যবহার করতে বা সিসার্গেস থেকে কোনও কিছু পড়ার পরিকল্পনা করলে আপনি এটি টুইট করতে পারেন (এটি হতে পারে) খুব ঝামেলা ছাড়াই সম্পন্ন)।
আমার অভিজ্ঞতায় পারফরম্যান্স এর কারণে খুব বেশি ক্ষতিগ্রস্থ হয় না, তবে কোনও খুব বড় মডিউল এইভাবে আমদানির আগে আপনার দুবার চিন্তা করা উচিত।
2.5 তে, এটি দমন করার কোনও উপায় নেই, ব্যবহারকারীদের ডিরেক্টরিতে লেখার অ্যাক্সেস না দেওয়ার মতো ব্যবস্থা ছাড়াও।
পাইথন ২.6 এবং 3.0.০ এ সিস মডিউলে "dont_write_bytecode" নামে একটি সেটিং থাকতে পারে যা এটি দমন করতে পারে। "-B" বিকল্পটি পাস করার মাধ্যমে, বা পরিবেশের পরিবর্তনশীল "PYTHONDONTWRITEBYTECODE" সেট করেও এটি সেট করা যেতে পারে
আপনি sys.dont_write_bytecode = True
আপনার উত্সে সেট করতে পারেন তবে এটি প্রথম পাইথন ফাইল লোড হওয়া উচিত। আপনি যদি মৃত্যুদন্ড কার্যকর করেন python somefile.py
তবে আপনি পাবেন না somefile.pyc
।
আপনি যখন কোনও ইউটিলিটি ব্যবহার করে ইনস্টল করবেন setup.py
এবং entry_points=
আপনি sys.dont_write_bytecode
স্টার্টআপ স্ক্রিপ্টটি সেট করবেন । সুতরাং আপনি সেটআপলগুলিতে উত্পন্ন "ডিফল্ট" স্টার্টআপ স্ক্রিপ্টের উপর নির্ভর করতে পারবেন না।
যুক্তি হিসাবে আপনি পাইথন ফাইলটি পাইথন দিয়ে শুরু করলে আপনি উল্লেখ করতে পারেন -B
:
python -B somefile.py
somefile.pyc
যাইহোক উত্পন্ন হবে না, তবে .pyc
অন্যান্য ফাইলগুলির জন্য খুব বেশি ফাইলও আমদানি করা হবে না।
আপনার যদি কিছু উপযোগিতা থাকে myutil
এবং আপনি এটি পরিবর্তন করতে না পারেন, এটি অজগর দোভাষীকে বি-বি পাস করবে না। পরিবেশের পরিবর্তনশীল সেট করে এটি শুরু করুন PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
আমার টেস্ট স্যুটে এবং ম্যাক টার্মিনালে পরীক্ষার স্যুটটি চালানোর আগে আমার বেশ কয়েকটি পরীক্ষার মামলা রয়েছে:
python LoginSuite.py
কমান্ডটি এইভাবে চালানো হচ্ছে আমার ডিরেক্টরি .pyc ফাইলগুলি দ্বারা পপুলেটেড। আমি নীচের বর্ণিত পদ্ধতিটি চেষ্টা করেছি এবং এটি সমস্যার সমাধান করেছে:
python -B LoginSuite.py
যদি আপনি পরীক্ষা স্যুটে পরীক্ষার কেসগুলি আমদানি করে এবং কমান্ড লাইনে স্যুটটি চালাচ্ছেন তবে এই পদ্ধতিটি কাজ করে।
পাইথন ৩.৮ দিয়ে শুরু করে আপনি PYTHONPYCACHEPREFIX
পাইথনের জন্য ক্যাশে ডিরেক্টরি নির্ধারণ করতে পরিবেশ পরিবর্তনশীলটি ব্যবহার করতে পারেন ।
পাইথন ডক্স থেকে:
যদি এটি সেট করা থাকে, পাইথন উত্স গাছের মধ্যে পাইচাই ডিরেক্টরিতে পরিবর্তে এই পথে একটি মিরর ডিরেক্টরি ট্রিতে .pyc ফাইলগুলি লিখবে । এটি -X পাইচছে_প্রিফিক্স = PATH বিকল্পটি নির্দিষ্ট করার সমান।
উদাহরণ
আপনি যদি ./profile
লিনাক্সে নিম্নলিখিত লাইনটি যুক্ত করেন :
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
পাইথন __pycache__
আপনার প্রকল্প ডিরেক্টরিতে বিরক্তিকর ডিরেক্টরিগুলি তৈরি করবে না , পরিবর্তে এটি সমস্তটির অধীনে রাখবে~/.cache/cpython/
পাইথন ইন্টারপ্রেটার যে চলমান ব্যবহারকারীর জন্য কেবলমাত্র পড়ার জন্য আপনার মডিউলগুলি রয়েছে সেগুলি আপনি ডিরেক্টরিগুলি তৈরি করতে পারেন।
আমি মনে করি না এর চেয়ে আরও দুর্দান্ত বিকল্প আছে। পিইপি 304 এটির জন্য একটি সহজ বিকল্প প্রবর্তন করার চেষ্টা হয়েছে বলে মনে হয়, তবে এটি পরিত্যাগ করা হয়েছে বলে মনে হয়।
আমি ভাবছি আপনি সম্ভবত আরও কিছু সমস্যা সমাধানের চেষ্টা করছেন, যার জন্য .py [কো] অক্ষম করা একটি কার্যকরী বলে মনে হবে তবে পরিবর্তে এই আসল সমস্যাটি যেই হোক না কেন আক্রমণ করা ভাল।
এর সমাধান ipython 6.2.1 using python 3.5.2
(উবুন্টু 16.04 এবং উইন্ডোজ 10 এ পরীক্ষিত):
Ipython
অনুবাদক বা %env PYTHONDONTWRITEBYTECODE =1
সেট ipython
আপ করার সময় সেট করা থাকলে সম্মান দেয় না ~/.ipython/profile-default/startup/00-startup.ipy
। পরিবর্তে আপনার মধ্যে নিম্নলিখিত ব্যবহার~.ipython/profile-default/startup/00-startup.py
import sys
sys.dont_write_bytecode=True
যতদূর আমি জানি পাইথন আপনাকে "আমদানি" সমস্ত মডিউল সংকলন করবে। তবে পাইথন পাইথন স্ক্রিপ্টটি রান করে এটি সংকলন করবে না: "পাইথন স্ক্রিপ্ট.পি" (এটি স্ক্রিপ্টটি আমদানি করে এমন কোনও মডিউল তৈরি করবে)।
আসল প্রশ্নগুলি হল আপনি কেন অজগরটি মডিউলগুলি সংকলন করতে চান না? যদি আপনি এটির উপায়টি পেয়ে থাকেন তবে আপনি সম্ভবত এটি পরিষ্কার করার কোনও উপায় স্বয়ংক্রিয় করতে পারেন।
.pyc
ফাইল রয়েছে। কিছু কারণে আমি যখন ক্লাস / মডিউলটি পরিবর্তন করি তখন .pyc
ফাইলটি আপডেট হয় না। সুতরাং আমি যখন .py
ফাইলটি পরিবর্তন করার পরে এটি আমদানি করব তখন এটি ফাইলটি ব্যবহার করবে .pyc
এবং ত্রুটির দিকে পরিচালিত করবে