software - python tutorial pdf




কিভাবে.pyc ফাইল এড়াতে? (6)

আমি কম্পাইল করা .pyc ফাইল জেনারেট ছাড়া পাইথন ইন্টারপ্রেটার চালাতে পারি?


2.5, ব্যবহারকারীরা ডিরেক্টরিটিকে অ্যাক্সেস লিখতে দেওয়ার মতো পদক্ষেপ ছাড়াই এটি দমন করার কোন উপায় দেয় না।

পাইথন 2.6 এবং 3.0 তে, তবে "dont_write_bytecode" নামক sys মডিউলে একটি সেটিং থাকতে পারে যা এটি দমন করতে সেট করা যেতে পারে। এটি "-বি" বিকল্পটি পাশ করে সেট করা যেতে পারে, অথবা পরিবেশ পরিবর্তনশীল "পাইথঅনন্ট্রাইভাইটয়েড"


আপনি sys.dont_write_bytecode = True আপনার উত্সতে sys.dont_write_bytecode = True সেট করতে পারেন, তবে এটি লোড হওয়া প্রথম পাইথন ফাইলে থাকতে হবে। যদি আপনি python somefile.py চালান করেন তবে আপনি python somefile.py পাবেন না।

যখন আপনি entry_points= এবং entry_points= ব্যবহার করে একটি ইউটিলিটি ইনস্টল করেন তখন আপনি স্টার্টআপ স্ক্রিপ্টে sys.dont_write_bytecode সেট sys.dont_write_bytecode । সুতরাং আপনি setuptools দ্বারা উত্পন্ন "ডিফল্ট" স্টার্টআপ স্ক্রিপ্ট উপর নির্ভর করতে পারবেন না।

যদি আপনি পাইথন ফাইলটি Python ফাইলের সাথে যুক্তি হিসাবে শুরু করেন তবে আপনি -B উল্লেখ করতে পারেন:

python -B somefile.py

.pyc যাইহোক জেনারেট করা হবে না, কিন্তু অন্যান্য ফাইলগুলির জন্যও .pyc ফাইলগুলি আমদানি করা হয়নি।

যদি আপনার কিছু ইউটিলিটি myutil এবং আপনি এটি পরিবর্তন করতে না পারেন তবে এটি পাইথন ইন্টারপ্রেটারে পাস হবে না। শুধু পরিবেশ পরিবর্তনশীল PYTHONDONTWRITEBYTECODE সেট করে এটি শুরু করুন:

PYTHONDONTWRITEBYTECODE=x myutil

আসলে পাইথন 2.3+ এ এটি করার একটি উপায়, তবে এটি একটি ক্ষুদ্র বিষয়। আমি জানি না যদি আপনি এটি বুঝতে পারেন তবে আপনি নিম্নলিখিতটি করতে পারেন:

$ 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'

zipimport লাইব্রেরির মতে:

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

সুতরাং, আপনাকে যা করতে হবে তা ফাইলগুলিকে জিপ করুন, আপনার sys.path এ zipfile যুক্ত করুন এবং তারপরে তাদের আমদানি করুন।

আপনি যদি ইউনিক্সের জন্য এটি তৈরি করেন তবে আপনি এই রেসিপিটি ব্যবহার করে আপনার স্ক্রিপ্ট প্যাকেজিংয়ের বিষয়ে বিবেচনা করতে পারেন: ইউনিক্স জিপ এক্সিকিউটেবল , তবে মনে রাখবেন আপনি যদি স্টডিন ব্যবহার করতে চান বা sys.args থেকে কিছু পড়তে চান তবে এটি আপনাকে টিভ করতে হবে (এটি হতে পারে খুব বেশী ঝামেলা ছাড়া সম্পন্ন)।

আমার অভিজ্ঞতা কর্মক্ষমতা এই কারণে খুব বেশী ভোগে না, কিন্তু আপনি এই ভাবে কোন বড় মডিউল আমদানি করার আগে দুবার চিন্তা করা উচিত।


পিয়থন ইন্টারপ্রেটারটি চলমান ব্যবহারকারীর জন্য কেবলমাত্র পঠনযোগ্য ডিরেক্টরিগুলিতে আপনার মডিউল বিদ্যমান থাকতে পারে।

আমি একটি আরো মার্জিত বিকল্প আছে মনে হয় না। PEP 304 এটির জন্য একটি সহজ বিকল্প পরিচয় দেওয়ার একটি প্রচেষ্টা হয়েছে বলে মনে হচ্ছে, কিন্তু এটি পরিত্যক্ত হয়েছে বলে মনে হচ্ছে।

আমি কল্পনা করেছি যে আপনি সম্ভবত সমাধান করার চেষ্টা করছেন এমন অন্য কোন সমস্যা আছে, যার জন্য অক্ষম করা .py [co] একটি কার্যকারিতা বলে মনে হবে, তবে এটি সম্ভবত এই আসল সমস্যাটির পরিবর্তে আক্রমণ করা ভাল হবে।


"পাইথন 2.6 -এ নতুন কী - ইন্টারপ্রেটার পরিবর্তনগুলি" থেকে :

পাইথনটি পাইপন ইন্টারপ্রেটারে -B সুইচটি সরবরাহ করে, অথবা পাইথন ইন্টারপ্রেটার চালানোর আগে পরিবেশগত পরিবর্তনশীল সেটিংটি স্থাপন করে PYTHONDONTWRITEBYTECODE বা .pyo ফাইলগুলি লেখার ক্ষেত্রে আটকানো যেতে পারে। এই সেটিংটি পাইথন প্রোগ্রামগুলিতে sys.dont_write_bytecode পরিবর্তনশীল হিসাবে পাওয়া যায় এবং পাইথন কোডটি ইন্টারপ্রেটারের আচরণ পরিবর্তন করতে মান পরিবর্তন করতে পারে।

2010-11-27 আপডেট করুন: পাইথন 3.2 একটি বিশেষ __pycache__ প্রবর্তন করে .pyc ফাইলগুলির সাথে ক্লাস্টারিং উত্স ফোল্ডারগুলির সমস্যাটি সমাধান করে, পাইথন 3.2 - পিওয়াইসি __pycache__ নতুন কী আছে তা দেখুন।


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 দেয় না। পরিবর্তে আপনার ~.ipython/profile-default/startup/00-startup.py এ নিম্নলিখিতটি ব্যবহার করে

import sys
Sys.dont_write_bytecode=True




python