2010-08-09 2 views
8

मैं distteils से एक बाइटकोड-केवल वितरण बनाना चाहता हूं (वास्तव में, मैं नहीं करता; मुझे पता है कि मैं क्या कर रहा हूं)। Setuptools और bdist_egg कमांड का उपयोग करके, आप बस - exclude-source पैरामीटर प्रदान कर सकते हैं। दुर्भाग्यवश मानक आदेशों में ऐसा कोई विकल्प नहीं है।distutils बाइनरी वितरण से स्रोत कैसे पट्टी?

  • क्या tar.gz, ज़िप, आरपीएम या डेब बनने से पहले स्रोत फ़ाइलों को पट्टी करने का कोई आसान तरीका है।
  • क्या ऐसा करने के लिए अपेक्षाकृत साफ प्रति-आदेश तरीका है (उदाहरण के लिए केवल tar.gz या ज़िप के लिए)।
+1

बहुत समान: http://stackoverflow.com/questions/261638/how-do-i-protect-python-code संकलित पायथन फाइलें (पीईसी/पीओओ) डिकंपाइल के लिए काफी तुच्छ हैं। –

+8

@ निक: वास्तव में नहीं। मैंने बिल्कुल सुरक्षा का जिक्र नहीं किया, और उस सवाल में distutils का उल्लेख नहीं है। स्पष्ट रूप से पाइथन बाइटकोड का विश्लेषण करना आसान है, अब वास्तव में पूछे गए प्रश्न को संबोधित करने के बारे में कैसे? – Draemon

+0

यदि आप बस ज़िप से सभी * .py फ़ाइलों को हटाना चाहते हैं: '7z d archive.zip * .py -r' –

उत्तर

11

distutils "build_py" कमांड एक मायने रखता है, क्योंकि यह (अप्रत्यक्ष रूप से) वितरण बनाने वाले सभी आदेशों द्वारा पुन: उपयोग किया जाता है। आप byte_compile (फ़ाइलें) विधि, कुछ की तरह ओवरराइड हैं:

try: 
    from setuptools.command.build_py import build_py 
except ImportError: 
    from distutils.command.build_py import build_py 

class build_py(build_py) 
    def byte_compile(self, files): 
     super(build_py, self).byte_compile(files) 
     for file in files: 
      if file.endswith('.py'): 
       os.unlink(file) 

setup(
    ... 
    cmdclass = dict(build_py=build_py), 
    ... 
) 

आप इसे बनाने के लिए सक्षम होना चाहिए ताकि स्रोत फ़ाइलों का निर्माण पेड़ इससे पहले कि वे "इंस्टॉल करें" निर्देशिका में प्रतिलिपि कर रहे हैं (से नष्ट हो जाती हैं जो एक अस्थायी निर्देशिका है जब bdist आदेश उन्हें बुलाते हैं)।

नोट: मैंने इस कोड का परीक्षण नहीं किया है; YMMV।

+0

+1। यह वही चीज है जिसकी मैं उम्मीद कर रहा था। मुझे एहसास नहीं हुआ था कि एक सामान्य build_py मैं हुक कर सकता था। मैं इसे आज़माउंगा और देख सकता हूं कि इसे किसी भी ट्वीविंग की आवश्यकता है या नहीं। – Draemon

+1

+1 लेकिन पायथन 2.7.6 पर यह काम नहीं करता है क्योंकि build_py एक पुरानी शैली की कक्षा है और इसका उपयोग सुपर() के साथ नहीं किया जा सकता है। मैंने 'build_py.byte_compile (स्वयं, फ़ाइलें) 'का उपयोग किया। (मैंने build_py क्लास का भी नाम बदल दिया है, इसलिए यह आयातित build_py को बंद नहीं करेगा।) –

1

इस प्रयास करें:

from distutils.command.install_lib import install_lib 

class install_lib(install_lib, object): 

    """ Class to overload install_lib so we remove .py files from the resulting 
    RPM """ 

    def run(self): 

     """ Overload the run method and remove all .py files after compilation 
     """ 

     super(install_lib, self).run() 
     for filename in self.install(): 
      if filename.endswith('.py'): 
       os.unlink(filename) 

    def get_outputs(self): 

     """ Overload the get_outputs method and remove any .py entries in the 
     file list """ 

     filenames = super(install_lib, self).get_outputs() 
     return [filename for filename in filenames 
       if not filename.endswith('.py')] 
1

हो सकता है कि एक पूर्ण काम कर यहाँ कोड :)

try: 
     from setuptools.command.build_py import build_py 
except ImportError: 
     from distutils.command.build_py import build_py 

import os 
import py_compile 

class custom_build_pyc(build_py): 
    def byte_compile(self, files): 
     for file in files: 
      if file.endswith('.py'): 
       py_compile.compile(file) 
       os.unlink(file) 
.... 
setup(
    name= 'sample project', 
    cmdclass = dict(build_py=custom_build_pyc), 
.... 
0

"मानक आदेशों इस तरह के एक विकल्प नहीं है"?

क्या आपके पास setuptools का नवीनतम संस्करण स्थापित है? और क्या आपने setup.py फ़ाइल लिखा था?

यदि ऐसा है, तो यह काम करना चाहिए: python setup.py bdist_egg --exclude-source-files

+0

मैंने इस सवाल में ध्यान दिया कि मैं bdist_egg के लिए ऐसा करने में कामयाब रहा। यह अन्य आउटपुट (उदा। ज़िप) था जिसमें विकल्प की कमी है। – Draemon