जवाबों:
से "नया क्या अजगर 2.6 में - दुभाषिया परिवर्तन" :
पायथन को अब पायथन इंटरप्रेटर में -B स्विच की आपूर्ति करके , या इंटरचेंटर चलाने से पहले PYTHONDONTWRITEBYTECODE पर्यावरण चर सेट करके -pyc या .pyo फ़ाइलों को लिखने से रोका जा सकता है । यह सेटिंग
sys.dont_write_bytecode
चर के रूप में पायथन कार्यक्रमों के लिए उपलब्ध है , और पायथन कोड दुभाषिया के व्यवहार को संशोधित करने के लिए मूल्य बदल सकता है।
अद्यतन 2010-11-27: पायथन 3.2 .pyc
एक विशेष __pycache__
सबफ़ोल्डर की शुरुआत करके फ़ाइलों के साथ स्रोत फ़ोल्डर के अव्यवस्था के मुद्दे को संबोधित करता है , देखें कि पायथन 3.2 में नया क्या है - पीवाईसी रिपोजिटरी निर्देशिकाएँ ।
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
सभी लिपियों पर लागू करने के लिए इसे अपने साथ जोड़ें । मेरे लिए, यह निर्देशिका थी $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
। सी एफ docs.python.org/2/tutorial/…
import sys; sys.dont_write_bytecode = True
वास्तव में इसे पाइथन 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'
जिपिमपोर्ट लाइब्रेरी के अनुसार :
कोई भी फ़ाइल ज़िप संग्रह में मौजूद हो सकती है, लेकिन केवल .py और .py [सह] फ़ाइलों के आयात के लिए उपलब्ध हैं। डायनामिक मॉड्यूल (.pyd, .so) का जिप आयात अस्वीकृत है। ध्यान दें कि यदि किसी संग्रह में केवल .py फाइलें हैं, तो Python, .pyc या .pyo फ़ाइल को जोड़कर संग्रह को संशोधित करने का प्रयास नहीं करेगा, जिसका अर्थ है कि यदि ज़िप संग्रह में .pyc फाइलें नहीं हैं, तो आयात करना धीमा हो सकता है।
इस प्रकार, आपको बस इतना करना है कि फाइलों को ज़िप करें, अपने sys.path में जिपफाइल जोड़ें और फिर उन्हें आयात करें।
यदि आप इसे UNIX के लिए बना रहे हैं, तो आप इस रेसिपी का उपयोग करके अपनी स्क्रिप्ट की पैकेजिंग पर भी विचार कर सकते हैं: यूनिक्स ज़िप एक्ज़ीक्यूटेबल , लेकिन ध्यान दें कि यदि आपको स्टाइन का उपयोग करने या sys.args से कुछ भी पढ़ने की योजना है, तो आपको इसे बदलना पड़ सकता है (यह हो सकता है) बहुत अधिक परेशानी के बिना)।
मेरे अनुभव में प्रदर्शन इस वजह से बहुत अधिक नहीं होता है, लेकिन आपको इस तरह से किसी भी बहुत बड़े मॉड्यूल को आयात करने से पहले दो बार सोचना चाहिए।
2.5 में, इसे दबाने का कोई तरीका नहीं है, इसके अलावा अन्य उपाय जैसे कि उपयोगकर्ताओं को निर्देशिका तक पहुंच नहीं देना है।
अजगर 2.6 और 3.0 में, हालांकि, sys मॉड्यूल में एक सेटिंग हो सकती है जिसे "NOT_write_bytecode" कहा जाता है जो इसे दबाने के लिए सेट किया जा सकता है। यह "-B" विकल्प को पास करके या पर्यावरण चर "PYTHONDONTWRITEBYTECEE" को सेट करके भी सेट किया जा सकता है
आप 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
और आप इसे बदल नहीं सकते हैं, तो यह अजगर इंटरप्रेटर के पास -B नहीं होगा। बस इसे पर्यावरण चर सेट करके शुरू करें PYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
मेरे पास एक परीक्षण सूट में कई परीक्षण मामले हैं और इससे पहले कि मैं मैक टर्मिनल में टेस्ट सूट इस तरह से चला रहा था:
python LoginSuite.py
कमांड को इस तरह से चलाने से मेरी निर्देशिका .pyc फाइलों के साथ आबाद हो रही थी। मैंने नीचे बताई गई विधि को आजमाया और इसने समस्या हल कर दी:
python -B LoginSuite.py
यह विधि काम करती है यदि आप परीक्षण मामलों को परीक्षण सूट में आयात कर रहे हैं और कमांड लाइन पर सूट चला रहे हैं।
अजगर 3.8 के साथ शुरू करके आप PYTHONPYCACHEPREFIX
पायथन के लिए कैश डायरेक्टरी को परिभाषित करने के लिए पर्यावरण चर का उपयोग कर सकते हैं ।
पायथन डॉक्स से:
यदि यह सेट किया गया है, तो पायथन इस पथ पर एक मिरर डायरेक्टरी ट्री में .pyc फाइलें लिखेगा, बजाय सोर्स ट्री के भीतर pycache डायरेक्टरीज़ के। यह -X pycache_prefix = PATH विकल्प को निर्दिष्ट करने के बराबर है।
उदाहरण
यदि आप ./profile
लिनक्स में निम्नलिखित लाइन जोड़ते हैं :
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
अजगर __pycache__
आपकी परियोजना निर्देशिका में कष्टप्रद निर्देशिकाओं का निर्माण नहीं करेगा , इसके बजाय यह उन सभी को नीचे रख देगा~/.cache/cpython/
आप उन निर्देशिकाओं को बना सकते हैं जो आपके मॉड्यूल केवल उस उपयोगकर्ता के लिए मौजूद हैं जो पायथन दुभाषिया के रूप में चल रहा है।
मुझे नहीं लगता कि एक और अधिक सुंदर विकल्प है। PEP 304 प्रतीत होता है कि इसके लिए एक सरल विकल्प शुरू करने का प्रयास किया गया था, लेकिन ऐसा लगता है कि इसे छोड़ दिया गया है।
मुझे लगता है कि शायद कोई और समस्या है जिसे आप हल करने का प्रयास कर रहे हैं, जिसके लिए .py [co] एक समाधान के रूप में दिखाई देगा, लेकिन यह संभव है कि इस मूल समस्या के बजाय जो भी हो उस पर हमला करना बेहतर होगा।
समाधान के लिए ipython 6.2.1 using python 3.5.2
(Ubuntu 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
जहां तक मुझे पता है कि अजगर आपके सभी मॉड्यूल "आयात" को संकलित करेगा। हालांकि अजगर एक पायथन स्क्रिप्ट को संकलित नहीं करेगा: "python script.py" (यह हालांकि स्क्रिप्ट आयात करने वाले किसी भी मॉड्यूल को संकलित करेगा)।
असली सवाल यह है कि आप मॉड्यूल को संकलित करने के लिए अजगर क्यों नहीं चाहते हैं? यदि आप रास्ते में मिल रहे हैं तो आप शायद इनकी सफाई का एक तरीका स्वचालित कर सकते हैं।
.pyc
फाइलें हैं। किसी कारण से, जब मैं क्लास / मॉड्यूल बदलता हूं, तो .pyc
फ़ाइल अपडेट नहीं होती है। इसलिए जब मैं .py
फ़ाइल को बदलने के बाद इसे आयात करता हूं , तो यह अभी भी .pyc
फ़ाइल का उपयोग करेगा , त्रुटियों के लिए अग्रणी होगा