कैसे बचें। पीसी फाइल्स से?


268

क्या मैं संकलित .pyc फ़ाइलों को उत्पन्न किए बिना अजगर इंटरप्रेटर चला सकता हूं?

जवाबों:


288

से "नया क्या अजगर 2.6 में - दुभाषिया परिवर्तन" :

पायथन को अब पायथन इंटरप्रेटर में -B स्विच की आपूर्ति करके , या इंटरचेंटर चलाने से पहले PYTHONDONTWRITEBYTECODE पर्यावरण चर सेट करके -pyc या .pyo फ़ाइलों को लिखने से रोका जा सकता है । यह सेटिंग sys.dont_write_bytecodeचर के रूप में पायथन कार्यक्रमों के लिए उपलब्ध है , और पायथन कोड दुभाषिया के व्यवहार को संशोधित करने के लिए मूल्य बदल सकता है।

अद्यतन 2010-11-27: पायथन 3.2 .pycएक विशेष __pycache__सबफ़ोल्डर की शुरुआत करके फ़ाइलों के साथ स्रोत फ़ोल्डर के अव्यवस्था के मुद्दे को संबोधित करता है , देखें कि पायथन 3.2 में नया क्या है - पीवाईसी रिपोजिटरी निर्देशिकाएँ


1
कम से कम OS X 10.8 पायथन 2.7 चलाने पर पर्यावरण चर का प्रभाव नहीं पड़ता है।
सॉरिन

5
यदि आप दुभाषिया (C ++ प्रोग्राम में) को एम्बेड कर रहे हैं, तो "Py_DontWriteBytecodeFlag = 1" का उपयोग करें; अपने स्रोत-कोड में यह pydebug.h में घोषित एक वैश्विक int है।
जिमब

1
पर्यावरण चर 2.7 में मेरे लिए ठीक काम करता है, पता नहीं है कि दूसरों को क्या समस्याएं हैं। धन्यवाद!
थॉमस

8
OSX (10.8 & 10.10) पर भी मेरे लिए काम किया; @sorin क्या आपने चर को ठीक से निर्यात किया है? export PYTHONDONTWRITEBYTECODE=1
नेवलिस

1
क्या आप जानते हैं कि पाइस्टेस्ट के साथ भी ऐसा ही कैसे किया जाता है।

110
import sys

sys.dont_write_bytecode = True

25
मैं सिर्फ यह कोशिश की और, यह आयातित मॉड्यूल के लिए काम करता है। विशेष रूप से, एक बार इस चर को कुछ भी आयात करने के बाद बाद में pyc फाइलें उत्पन्न नहीं होंगी। यह रमणीय है। धन्यवाद।

पेरेंट मॉड्यूल में इसे जोड़ने के बजाय, संदर्भित स्क्रिप्ट में इसे जोड़ने का प्रयास करें। यह अच्छा काम करता है। धन्यवाद विल्सन @te लिए
Sathy

4
इसे अपने site-packages/usercustomize.pyसभी लिपियों पर लागू करने के लिए इसे अपने साथ जोड़ें । मेरे लिए, यह निर्देशिका थी $HOME/.local/lib/python2.6/site-pacakges/usercustomize.py। सी एफ docs.python.org/2/tutorial/…
RobM

3
मेरा साइट-पैकेज यहां स्थित था: /usr/local/lib/python2.7/site-packages और मुझे usercustomize.py
anon58192932

3
या एक पंक्ति में:import sys; sys.dont_write_bytecode = True
ET-CS

23

वास्तव में इसे पाइथन 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 से कुछ भी पढ़ने की योजना है, तो आपको इसे बदलना पड़ सकता है (यह हो सकता है) बहुत अधिक परेशानी के बिना)।

मेरे अनुभव में प्रदर्शन इस वजह से बहुत अधिक नहीं होता है, लेकिन आपको इस तरह से किसी भी बहुत बड़े मॉड्यूल को आयात करने से पहले दो बार सोचना चाहिए।


11

2.5 में, इसे दबाने का कोई तरीका नहीं है, इसके अलावा अन्य उपाय जैसे कि उपयोगकर्ताओं को निर्देशिका तक पहुंच नहीं देना है।

अजगर 2.6 और 3.0 में, हालांकि, sys मॉड्यूल में एक सेटिंग हो सकती है जिसे "NOT_write_bytecode" कहा जाता है जो इसे दबाने के लिए सेट किया जा सकता है। यह "-B" विकल्प को पास करके या पर्यावरण चर "PYTHONDONTWRITEBYTECEE" को सेट करके भी सेट किया जा सकता है


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और आप इसे बदल नहीं सकते हैं, तो यह अजगर इंटरप्रेटर के पास -B नहीं होगा। बस इसे पर्यावरण चर सेट करके शुरू करें PYTHONDONTWRITEBYTECODE:

PYTHONDONTWRITEBYTECODE=x myutil

4

मेरे पास एक परीक्षण सूट में कई परीक्षण मामले हैं और इससे पहले कि मैं मैक टर्मिनल में टेस्ट सूट इस तरह से चला रहा था:

python LoginSuite.py

कमांड को इस तरह से चलाने से मेरी निर्देशिका .pyc फाइलों के साथ आबाद हो रही थी। मैंने नीचे बताई गई विधि को आजमाया और इसने समस्या हल कर दी:

python -B LoginSuite.py

यह विधि काम करती है यदि आप परीक्षण मामलों को परीक्षण सूट में आयात कर रहे हैं और कमांड लाइन पर सूट चला रहे हैं।


4

अजगर 3.8 के साथ शुरू करके आप PYTHONPYCACHEPREFIXपायथन के लिए कैश डायरेक्टरी को परिभाषित करने के लिए पर्यावरण चर का उपयोग कर सकते हैं ।

पायथन डॉक्स से:

यदि यह सेट किया गया है, तो पायथन इस पथ पर एक मिरर डायरेक्टरी ट्री में .pyc फाइलें लिखेगा, बजाय सोर्स ट्री के भीतर pycache डायरेक्टरीज़ के। यह -X pycache_prefix = PATH विकल्प को निर्दिष्ट करने के बराबर है।

उदाहरण

यदि आप ./profileलिनक्स में निम्नलिखित लाइन जोड़ते हैं :

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

अजगर __pycache__आपकी परियोजना निर्देशिका में कष्टप्रद निर्देशिकाओं का निर्माण नहीं करेगा , इसके बजाय यह उन सभी को नीचे रख देगा~/.cache/cpython/


2

आप उन निर्देशिकाओं को बना सकते हैं जो आपके मॉड्यूल केवल उस उपयोगकर्ता के लिए मौजूद हैं जो पायथन दुभाषिया के रूप में चल रहा है।

मुझे नहीं लगता कि एक और अधिक सुंदर विकल्प है। PEP 304 प्रतीत होता है कि इसके लिए एक सरल विकल्प शुरू करने का प्रयास किया गया था, लेकिन ऐसा लगता है कि इसे छोड़ दिया गया है।

मुझे लगता है कि शायद कोई और समस्या है जिसे आप हल करने का प्रयास कर रहे हैं, जिसके लिए .py [co] एक समाधान के रूप में दिखाई देगा, लेकिन यह संभव है कि इस मूल समस्या के बजाय जो भी हो उस पर हमला करना बेहतर होगा।


2

समाधान के लिए 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

0

जहां तक ​​मुझे पता है कि अजगर आपके सभी मॉड्यूल "आयात" को संकलित करेगा। हालांकि अजगर एक पायथन स्क्रिप्ट को संकलित नहीं करेगा: "python script.py" (यह हालांकि स्क्रिप्ट आयात करने वाले किसी भी मॉड्यूल को संकलित करेगा)।

असली सवाल यह है कि आप मॉड्यूल को संकलित करने के लिए अजगर क्यों नहीं चाहते हैं? यदि आप रास्ते में मिल रहे हैं तो आप शायद इनकी सफाई का एक तरीका स्वचालित कर सकते हैं।


मैंने अक्सर पाया है कि बासी बायटेकोड .pycफाइलें हैं। किसी कारण से, जब मैं क्लास / मॉड्यूल बदलता हूं, तो .pycफ़ाइल अपडेट नहीं होती है। इसलिए जब मैं .pyफ़ाइल को बदलने के बाद इसे आयात करता हूं , तो यह अभी भी .pycफ़ाइल का उपयोग करेगा , त्रुटियों के लिए अग्रणी होगा
Alpha_989
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.