কীভাবে পিপিসি ফাইল এড়ানো যায়?


268

সংকলিত .pyc ফাইলগুলি তৈরি না করে আমি কী পাইথন ইন্টারপ্রেটার চালাতে পারি?

উত্তর:


288

থেকে "কি নিউ পাইথন 2.6 মধ্যে - ইন্টারপ্রেটার পরিবর্তনসমূহ" :

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

2010-10-27 আপডেট করুন: পাইথন ৩.২ .pycফাইলের সাথে বিশৃঙ্খলা উত্স ফোল্ডারগুলির একটি বিশেষ __pycache__সাবফোল্ডার প্রবর্তন করে, পাইথন ৩.২-এ নতুন কী দেখুন - পিওয়াইসি সংগ্রহস্থল ডিরেক্টরিগুলি


1
কমপক্ষে ওএস এক্স ১০.৮-তে পাইথন ২.7 চলমান এনভায়রনমেন্ট ভেরিয়েবল কার্যকর হয়নি।
সোমিন

5
আপনি যদি ইন্টারপ্রেটার এম্বেড করে থাকেন (একটি সি ++ প্রোগ্রামে), "পাই_ডন্টওরাইটবাইটেকোডফ্ল্যাগ = 1 ব্যবহার করুন;" আপনার উত্স-কোডে এটি একটি গ্লোবাল ইন পাইডবুগ। H এ ঘোষিত।
জিম্ব

1
পরিবেশের পরিবর্তনশীল আমার জন্য ২.7-এ ঠিকঠাক কাজ করে, অন্যরা কী কী সমস্যায় পড়ছে তা জানেন না। ধন্যবাদ!
টমাস

8
ওএসএক্সেও আমার জন্য কাজ করেছেন (10.8 & 10.10); @ সোরিন আপনি কি ভেরিয়েবলটি সঠিকভাবে রফতানি করেছেন? export PYTHONDONTWRITEBYTECODE=1
নেভেলিস

1
আপনি কীভাবে পাইস্টেস্ট দিয়ে একই কাজ করতে জানেন?

110
import sys

sys.dont_write_bytecode = True

25
আমি এটি চেষ্টা করেছি এবং, এটি আমদানি করা মডিউলগুলির জন্য কাজ করে। বিশেষত, একবার এই পরিবর্তনশীলটি আমদানি করা কোনও কিছুর পরে সেট করে পিআইসি ফাইল তৈরি করে না। এটি আনন্দদায়ক। ধন্যবাদ।

বরং এটি প্যারেন্ট মডিউলটিতে যুক্ত করুন, রেফারেন্স করা স্ক্রিপ্টে এটি যুক্ত করার চেষ্টা করুন। এটি দুর্দান্ত কাজ করে। @ উইলসনকে ধন্যবাদ
সাথী

4
আপনার site-packages/usercustomize.pyসমস্ত স্ক্রিপ্টগুলিতে এটি প্রয়োগ করতে এটিতে এটি যুক্ত করুন। আমার জন্য, এই ডিরেক্টরি ছিল $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py। Cf. docs.python.org/2/tutorial/…
রবএম

3
আমার সাইট-প্যাকেজগুলি ছিল: /usr/local/lib/python2.7/site-packages এ এবং আমি
ইউজার

3
বা এক লাইনে:import sys; sys.dont_write_bytecode = True
ET-CS

23

পাইথন ২.৩++ তে এটি করার একটি উপায় আছে তবে এটি কিছুটা রহস্যজনক। আপনি এটি বুঝতে পেরেছেন কিনা তা আমি জানি না তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

$ 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 ফাইলগুলি না থাকে, আমদানি বরং ধীর হতে পারে।

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

আপনি যদি ইউনিক্সের জন্য এটি নির্মাণ করে থাকেন তবে আপনি এই রেসিপিটি ব্যবহার করে আপনার স্ক্রিপ্টটি প্যাকেজিংয়ের বিষয়টিও বিবেচনা করতে পারেন: ইউনিক্স জিপ এক্সিকিউটেবল , তবে নোট করুন যে আপনি স্টিডিন ব্যবহার করতে বা সিসার্গেস থেকে কোনও কিছু পড়ার পরিকল্পনা করলে আপনি এটি টুইট করতে পারেন (এটি হতে পারে) খুব ঝামেলা ছাড়াই সম্পন্ন)।

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


11

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

পাইথন ২.6 এবং 3.0.০ এ সিস মডিউলে "dont_write_bytecode" নামে একটি সেটিং থাকতে পারে যা এটি দমন করতে পারে। "-B" বিকল্পটি পাস করার মাধ্যমে, বা পরিবেশের পরিবর্তনশীল "PYTHONDONTWRITEBYTECODE" সেট করেও এটি সেট করা যেতে পারে


7

আপনি 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

4

আমার টেস্ট স্যুটে এবং ম্যাক টার্মিনালে পরীক্ষার স্যুটটি চালানোর আগে আমার বেশ কয়েকটি পরীক্ষার মামলা রয়েছে:

python LoginSuite.py

কমান্ডটি এইভাবে চালানো হচ্ছে আমার ডিরেক্টরি .pyc ফাইলগুলি দ্বারা পপুলেটেড। আমি নীচের বর্ণিত পদ্ধতিটি চেষ্টা করেছি এবং এটি সমস্যার সমাধান করেছে:

python -B LoginSuite.py

যদি আপনি পরীক্ষা স্যুটে পরীক্ষার কেসগুলি আমদানি করে এবং কমান্ড লাইনে স্যুটটি চালাচ্ছেন তবে এই পদ্ধতিটি কাজ করে।


4

পাইথন ৩.৮ দিয়ে শুরু করে আপনি PYTHONPYCACHEPREFIXপাইথনের জন্য ক্যাশে ডিরেক্টরি নির্ধারণ করতে পরিবেশ পরিবর্তনশীলটি ব্যবহার করতে পারেন ।

পাইথন ডক্স থেকে:

যদি এটি সেট করা থাকে, পাইথন উত্স গাছের মধ্যে পাইচাই ডিরেক্টরিতে পরিবর্তে এই পথে একটি মিরর ডিরেক্টরি ট্রিতে .pyc ফাইলগুলি লিখবে । এটি -X পাইচছে_প্রিফিক্স = PATH বিকল্পটি নির্দিষ্ট করার সমান।

উদাহরণ

আপনি যদি ./profileলিনাক্সে নিম্নলিখিত লাইনটি যুক্ত করেন :

export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"

পাইথন __pycache__আপনার প্রকল্প ডিরেক্টরিতে বিরক্তিকর ডিরেক্টরিগুলি তৈরি করবে না , পরিবর্তে এটি সমস্তটির অধীনে রাখবে~/.cache/cpython/


2

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

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

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


2

এর সমাধান 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

0

যতদূর আমি জানি পাইথন আপনাকে "আমদানি" সমস্ত মডিউল সংকলন করবে। তবে পাইথন পাইথন স্ক্রিপ্টটি রান করে এটি সংকলন করবে না: "পাইথন স্ক্রিপ্ট.পি" (এটি স্ক্রিপ্টটি আমদানি করে এমন কোনও মডিউল তৈরি করবে)।

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


আমি প্রায়শই খুঁজে পেয়েছি যে বাসি বাইকোড .pycফাইল রয়েছে। কিছু কারণে আমি যখন ক্লাস / মডিউলটি পরিবর্তন করি তখন .pycফাইলটি আপডেট হয় না। সুতরাং আমি যখন .pyফাইলটি পরিবর্তন করার পরে এটি আমদানি করব তখন এটি ফাইলটি ব্যবহার করবে .pycএবং ত্রুটির দিকে পরিচালিত করবে
alpha_989
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.