मैं .py फ़ाइल से मैन्युअल रूप से एक .pyc फ़ाइल कैसे बना सकता हूं


128

किसी कारण से, मैं स्वचालित रूप से .pyc फ़ाइल जनरेट करने के लिए पायथन के "इम्पोर्ट" स्टेटमेंट पर निर्भर नहीं हो सकता

निम्नलिखित के रूप में एक समारोह को लागू करने का एक तरीका है?

def py_to_pyc(py_filepath, pyc_filepath):
    ...

जवाबों:


241

आप compileallटर्मिनल में उपयोग कर सकते हैं । निम्न आदेश पुनरावर्ती उप निर्देशिकाओं में जाएगा और सभी पायथन फ़ाइलों के लिए pyc फ़ाइलें बनाता है जो इसे पाता है। Compileall ताकि आप इसे उपयोग करने के लिए कुछ भी अतिरिक्त स्थापित करने की आवश्यकता नहीं है मॉड्यूल, अजगर मानक पुस्तकालय का हिस्सा है। यह python2 और python3 के लिए ठीक उसी तरह काम करता है।

python -m compileall .

4
रिकर्सिवली :): यह * .pyc में सभी * .py संकलित करने के लिए मेरी जरूरत में कम से कम --at स्वीकार किए जाते हैं जवाब होना चाहिए
swdev

1
क्या यह संभव है कि PYC फाइल का इस्तेमाल सभी पुस्तकालयों में किया जाए? इसलिए उपयोगकर्ताओं को उन्हें स्थापित करने की आवश्यकता नहीं है, बस PYC फ़ाइल चलाई है, मुझे पता है कि जावा में यह संभव है कि एक JAR का उपयोग करके पायथन के लिए कोई समान विधि है?
डी। स्नेप

मैंने पायथन में मेटा फ़ाइलों के बारे में भी कुछ सुना। यह संकलन कुछ कैश का निर्माण भी करता है? यदि नहीं, तो उसके लिए क्या आज्ञा है ?? चूंकि एंड-यूजर्स के पास लिबर डायरेक्टरी की अनुमति नहीं होती है। और मैं यहां चीजों को गति देना चाहता हूं ... पीएस। भी पर एक नज़र डालें -O, बाईटकोड के लिए (.pyo फ़ाइल आईएसओ .pyc) संकलन झंडा।
खतरे '

विघटित करने के बारे में क्या?
सजुक

1
इस आदेश के साथ सावधान रहें। मैंने गलती से compileallअपनी साइट-संकुल फ़ोल्डर पर किया था और इसने सब कुछ गड़बड़ कर दिया
एलेक्स

58

आप कमांड लाइन से अलग-अलग फाइलों को जमा कर सकते हैं:

python -m compileall <file_1>.py <file_n>.py

55

जब से मैंने आखिरी बार अजगर का उपयोग किया है, तब से यह हो गया है, लेकिन मेरा मानना ​​है कि आप इसका उपयोग कर सकते हैं py_compile:

import py_compile
py_compile.compile("file.py")

8
आप शायद दूसरा पैरामीटर शामिल करना चाहते हैं, जो आउटपुट फ़ाइल को निर्धारित करता है। अन्यथा, यह किसी चीज़ को डिफॉल्ट करता है __pycache__/file.cpython-32.pycऔर आपको वह रिटर्न मान के रूप में मिलता है।
rvighne

46

मुझे पायथन लिपियों को बायटेकोड में संकलित करने के कई तरीके मिले

  1. py_compileटर्मिनल में उपयोग करना :

    python -m py_compile File1.py File2.py File3.py ...

    -m संकलित किए जाने वाले मॉड्यूल (नामों) को निर्दिष्ट करता है।

    या, फ़ाइलों के संवादात्मक संकलन के लिए

    python -m py_compile -
    File1.py
    File2.py
    File3.py
       .
       .
       .
  2. का उपयोग कर py_compile.compile:

    import py_compile
    py_compile.compile('YourFileName.py')
  3. का उपयोग कर py_compile.main():

    यह एक बार में कई फाइलों को संकलित करता है।

    import py_compile
    py_compile.main(['File1.py','File2.py','File3.py'])

    जब तक आप चाहें तब तक सूची बढ़ सकती है। वैकल्पिक रूप से, आप स्पष्ट रूप से कमांड लाइन आर्ग्स में मुख्य या यहां तक ​​कि फ़ाइल नामों की सूची पास कर सकते हैं।

    या, यदि आप ['-']मुख्य में पास होते हैं तो यह अंतःक्रियात्मक रूप से फाइलों को संकलित कर सकता है।

  4. का उपयोग कर compileall.compile_dir():

    import compileall
    compileall.compile_dir(direname)

    यह आपूर्ति की गई निर्देशिका में मौजूद हर एक पायथन फाइल को संकलित करता है।

  5. का उपयोग कर compileall.compile_file():

    import compileall
    compileall.compile_file('YourFileName.py')

नीचे दिए गए लिंक पर एक नज़र डालें:

https://docs.python.org/3/library/py_compile.html

https://docs.python.org/3/library/compileall.html


एक छोटा सुधार यह है कि आपके द्वारा लोड किया जा रहा मॉड्यूल नाम है py_compileऔर compileallनहीं py_compile.pyया compileall.py। दूसरे शब्दों में, यह होना चाहिए python3 -m py_compile PYTHON_FILENAMEया python3 -m compileall PYTHON_FILES_DIRECTORY
देवरी

17

मैं कंपाइल का उपयोग करूंगा । यह स्क्रिप्ट और कमांड लाइन से अच्छी तरह से काम करता है। यह पहले से उल्लिखित p__compile की तुलना में थोड़ा अधिक उच्च स्तरीय मॉड्यूल / उपकरण है जो आंतरिक रूप से भी उपयोग करता है।


compileallउन फ़ाइलों को छोड़ने के लिए तर्क शामिल नहीं है जिनके लिए संबंधित .pycफ़ाइल पहले से अद्यतित है, क्या यह?
काइल स्ट्रैंड

2
@KyleStrand उन compileallफ़ाइलों को छोड़ देता है जिनमें पहले से ही एक अप-टू-डेट .pyc(पाइथन
2.7.11 के

@ दिलचस्प नाम। मुझे यकीन नहीं है कि मैंने अन्यथा क्यों सोचा। जाँच के लिए धन्यवाद।
काइल स्ट्रैंड

6

Python2 में आप उपयोग कर सकते हैं:

python -m compileall <pythonic-project-name>

जो बनाता है सभी को संकलित .pyकरने के लिए .pycपरियोजना जो सबफ़ोल्डर निहित में।


Python3 में आप उपयोग कर सकते हैं:

python3 -m compileall <pythonic-project-name>

जो सबफ़ोल्डर में शामिल प्रोजेक्ट में सभी फ़ोल्डरों .pyको संकलित करता है __pycache__

या इस पोस्ट से ब्राउनिंग के साथ :

आप .pycफ़ोल्डर में फ़ाइलों के समान लेआउट का उपयोग करके Python2 के रूप में लागू कर सकते हैं:

python3 -m compileall -b <pythonic-project-name>

विकल्प फ़ाइलों -bके उत्पादन .pycको उनकी विरासत-स्थानों (जैसे कि Python2 के समान) में चलाता है।


3

मूल प्रश्न आवश्यकताओं (स्रोत पथ और गंतव्य पथ) से मेल खाने के लिए कोड इस तरह होना चाहिए:

import py_compile
py_compile.compile(py_filepath, pyc_filepath)

यदि इनपुट कोड में त्रुटियां हैं तो py_compile.PyCompileError अपवाद उठाया गया है।


1

ऐसा करने का दो तरीका है

  1. कमांड लाइन
  2. अजगर कार्यक्रम का उपयोग करना

यदि आप कमांड लाइन का उपयोग कर रहे हैं python -m compileall <argument> python बाइनरी कोड को python कोड संकलित करने के लिए । उदाहरण के लिए:python -m compileall -x ./*

या, आप अपनी लाइब्रेरी को बाइट-कोड में संकलित करने के लिए इस कोड का उपयोग कर सकते हैं।

import compileall
import os

lib_path = "your_lib_path"
build_path = "your-dest_path"

compileall.compile_dir(lib_path, force=True, legacy=True)

def compile(cu_path):
    for file in os.listdir(cu_path):
        if os.path.isdir(os.path.join(cu_path, file)):
            compile(os.path.join(cu_path, file))
        elif file.endswith(".pyc"):
            dest = os.path.join(build_path, cu_path ,file)
            os.makedirs(os.path.dirname(dest), exist_ok=True)
            os.rename(os.path.join(cu_path, file), dest)

compile(lib_path)

विस्तृत प्रलेखन के लिए at docs.python.org देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.