क्या मैं संकलित .pyc फ़ाइलों को उत्पन्न किए बिना पाइथन दुभाषिया चला सकता हूं?.pyc फ़ाइलों से कैसे बचें?
उत्तर
"What’s New in Python 2.6 - Interpreter Changes" से से सेट किया जा सकता:
अजगर अब तक .pyc या .pyo फ़ाइलों लेखन से रोका जा सकता है -B की आपूर्ति पाइथन दुभाषिया पर स्विच करें, या PYTHONDONTWRITEBYTECODE पर्यावरण दुभाषिया चलाने से पहले परिवर्तनीय को सेट करके। यह सेटिंग को पाइथन प्रोग्राम में
sys.dont_write_bytecode
चर के रूप में उपलब्ध है, और पायथन कोड को मानकर्ता के व्यवहार को संशोधित कर सकता है।
अद्यतन 2010-11-27: अजगर 3.2 पतों एक विशेष __pycache__
सबफ़ोल्डर शुरू करने से .pyc
फाइलों के साथ स्रोत फ़ोल्डरों को अव्यवस्थित के मुद्दे, What's New in Python 3.2 - PYC Repository Directories देखते हैं।
जहां तक मुझे पता है कि पाइथन आपके द्वारा "आयात" किए गए सभी मॉड्यूल संकलित करेगा। हालांकि पायथन एक पायथन स्क्रिप्ट को संकलित नहीं करेगा: "python script.py" (हालांकि यह स्क्रिप्ट आयात करने वाले किसी भी मॉड्यूल को संकलित करेगा)।
वास्तविक प्रश्न यह है कि आप पाइथन मॉड्यूल को संकलित क्यों नहीं करना चाहते हैं? यदि वे रास्ते में आ रहे हैं तो आप शायद इन्हें साफ करने का एक तरीका स्वचालित कर सकते हैं।
मैं अक्सर पाया है निम्नलिखित बासी बाईटकोड देखते हैं कि '.pyc' फ़ाइलें। किसी कारण से, जब मैं कक्षा/मॉड्यूल बदलता हूं, तो '.pyc' फ़ाइल अपडेट नहीं होती है। इसलिए जब मैं '.py' फ़ाइल को बदलने के बाद इसे आयात करता हूं, तो यह अभी भी' .pyc' फ़ाइल का उपयोग करेगा, जिससे –
आप निर्देशिका बना सकते हैं कि आपके मॉड्यूल केवल उपयोगकर्ता के लिए पढ़ने के लिए मौजूद हैं जो पाइथन दुभाषिया के रूप में चल रहा है।
मुझे नहीं लगता कि एक और अधिक सुरुचिपूर्ण विकल्प है। प्रतीत होता है कि PEP 304 इसके लिए एक आसान विकल्प पेश करने का प्रयास रहा है, लेकिन ऐसा लगता है कि इसे छोड़ दिया गया है।
मुझे लगता है कि शायद कुछ अन्य समस्याएं हल करने की कोशिश कर रहे हैं, जिसके लिए अक्षम करना .py [co] एक कामकाज प्रतीत होता है, लेकिन संभवतः यह मूल समस्या जो भी हो, हमला करने के लिए बेहतर होगा।
2.5 में, उपयोगकर्ताओं को निर्देशिका में पहुंच लिखने जैसी उपायों के अलावा, इसे दबाने का कोई तरीका नहीं है।
पायथन 2.6 और 3.0 में हालांकि, "dont_write_bytecode" नामक sys मॉड्यूल में एक सेटिंग हो सकती है जिसे इसे दबाने के लिए सेट किया जा सकता है। यह भी "-B" विकल्प गुजर, या स्थापित करने वातावरण चर "PYTHONDONTWRITEBYTECODE"
वास्तव में पाइथन 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 [सह] आयात के लिए उपलब्ध हैं। गतिशील मॉड्यूल (.pyd, .so) के ज़िप आयात की अनुमति नहीं है। ध्यान दें कि यदि किसी संग्रह में केवल .py फ़ाइलें होती हैं, तो Python संबंधित .pyc या .pyo फ़ाइल को जोड़कर संग्रह को संशोधित करने का प्रयास नहीं करेगा, जिसका अर्थ है कि यदि ज़िप संग्रह में .pyc फ़ाइलें नहीं हैं, तो आयात करना धीमा हो सकता है।
इस प्रकार, आपको बस फाइलों को ज़िप करना है, अपने sys.path में ज़िपफाइल जोड़ें और फिर उन्हें आयात करें।
यदि आप इसे यूनिक्स के लिए बना रहे हैं, तो आप इस नुस्खा का उपयोग करके अपनी स्क्रिप्ट को पैकेजिंग पर भी विचार कर सकते हैं: unix zip executable, लेकिन ध्यान दें कि यदि आप stdin का उपयोग करने या sys.args से कुछ भी पढ़ने की योजना बना रहे हैं तो आपको इसे ट्वीक करना पड़ सकता है (यह बहुत अधिक परेशानी के बिना किया जा सकता है)।
मेरे अनुभव प्रदर्शन में इस वजह से बहुत अधिक पीड़ा नहीं है, लेकिन आपको इस तरह से किसी भी बड़े मॉड्यूल को आयात करने से पहले दो बार सोचना चाहिए।
import sys
sys.dont_write_bytecode = True
यह आयातित मॉड्यूल –
के लिए काम नहीं करता है मैंने अभी कोशिश की है और यह आयातित मॉड्यूल के लिए काम करता है। विशेष रूप से, एक बार जब यह चर सेट किया जाता है तो बाद में आयात किए गए कुछ भी पीईसी फाइलें उत्पन्न नहीं करेंगे। यह रमणीय है। धन्यवाद। –
इसे पेरेंट मॉड्यूल में जोड़ने के बजाय, इसे संदर्भित स्क्रिप्ट में जोड़ने का प्रयास करें। यह अच्छा काम करता है। @te wilson – Sathy
मैं टेस्ट स्वीट में कई परीक्षण मामलों है और इससे पहले कि मैं इस तरह मैक टर्मिनल में टेस्ट स्वीट चल रहा था:
python LoginSuite.py
आदेश इस तरह से चल रहा है मेरी निर्देशिका आबादी वाले किया जा रहा था .pyc फ़ाइलों के साथ। मैं नीचे वर्णित विधि की कोशिश की और यह समस्या हल हो जाती:
python -B LoginSuite.py
इस विधि से काम करता है अगर आप परीक्षण सुइट में परीक्षण मामलों आयात कर रहे हैं और कमांड लाइन पर सूट चल रहा है।
आप अपने स्रोत में sys.dont_write_bytecode = True
सेट कर सकते हैं, लेकिन इसे लोड की गई पहली पायथन फ़ाइल में होना होगा। यदि आप python somefile.py
निष्पादित करते हैं तो आपको somefile.pyc
नहीं मिलेगा।
जब आप setup.py
और entry_points=
का उपयोग कर उपयोगिता स्थापित करते हैं तो आप स्टार्टअप स्क्रिप्ट में sys.dont_write_bytecode
सेट करेंगे। तो आप setuptools द्वारा जेनरेट की गई "डिफ़ॉल्ट" स्टार्टअप स्क्रिप्ट पर भरोसा नहीं कर सकते हैं।
आप अपने आप को तर्क के रूप में अजगर फ़ाइल के साथ अजगर शुरू करते हैं तो आप -B
निर्दिष्ट कर सकते हैं:
python -B somefile.py
somefile.pyc
वैसे भी उत्पन्न नहीं किया जाएगा, लेकिन भी आयातित अन्य फ़ाइलों के लिए कोई .pyc
फ़ाइलें।
यदि आपके पास कुछ उपयोगिता myutil
है और आप इसे बदल नहीं सकते हैं, तो यह पाइथन दुभाषिया को पास नहीं करेगा। बस वातावरण चर PYTHONDONTWRITEBYTECODE
निर्धारित करके इसे शुरू:
PYTHONDONTWRITEBYTECODE=x myutil
ipython 6.2.1 using python 3.5.2
(उबंटू 16.04 और Windows 10 पर परीक्षण किया गया) के लिए समाधान:
Ipython
%env PYTHONDONTWRITEBYTECODE =1
सम्मान नहीं करता है, तो ipython
interpretor में या में स्टार्टअप के दौरान सेट ~/.ipython/profile-default/startup/00-startup.ipy
। इसके बजाय का उपयोग करने में अपने ~.ipython/profile-default/startup/00-startup.py
import sys
Sys.dont_write_bytecode=True
त्रुटियों की ओर अग्रसर होता है कम से कम ओएस एक्स 10.8 पाइथन 2.7 चल रहा है, पर्यावरण परिवर्तनीय प्रभाव नहीं पड़ता है। – sorin
यदि आप दुभाषिया को एम्बेड कर रहे हैं (एक C++ प्रोग्राम में), "Py_DontWriteBytecodeFlag = 1;" का उपयोग करें आपके स्रोत कोड में।यह एक वैश्विक int pydebug.h में घोषित किया गया है। – JimB
हाँ यह कभी काम नहीं करता है। – tar