2010-08-09 11 views
8

Voglio creare una distribuzione solo bytecode da distutils (no davvero, lo so, so cosa sto facendo). Usando setuptools e il comando bdist_egg, puoi semplicemente fornire il parametro --exclude-source. Sfortunatamente i comandi standard non hanno questa opzione.Come rimuovere la fonte dalle distribuzioni binarie di distutils?

  • C'è un modo semplice per rimuovere i file sorgente appena prima che vengano creati tar.gz, zip, rpm o deb.
  • C'è un modo relativamente pulito per comando per farlo (ad es. Solo per tar.gz o zip).
+1

Molto simile: http://stackoverflow.com/questions/261638/how-do-i-protect-python-code I file python compilati (pyc/pyo) sono abbastanza banali da decompilare. –

+8

@Nick: non proprio. Non ho menzionato affatto la protezione e questa domanda non menziona le distutils. Ovviamente il bytecode python è facile da analizzare, ora che ne dici di rispondere alla domanda che ho effettivamente posto? – Draemon

+0

Se si desidera rimuovere tutti i file * .py da un file zip: '7z d archive.zip * .py -r' –

risposta

11

Il comando distutils "build_py" è quello che conta, poiché è (indirettamente) riutilizzato da tutti i comandi che creano distribuzioni. Se si ignora il byte_compile (file) metodo, qualcosa di simile:

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), 
    ... 
) 

Si dovrebbe essere in grado di fare in modo che i file di origine vengono eliminati dal albero di compilazione prima di essere copiati nella directory "install" (che è una directory temporanea quando i comandi bdist li invocano).

Nota: non ho testato questo codice; YMMV.

+0

+1. Questo è solo il genere di cose che speravo. Non mi ero reso conto che esistesse un build_py comune a cui potevo collegare. Proverò questo e vedrò se ha bisogno di qualche ritocco. – Draemon

+1

+1 ma su Python 2.7.6 non funziona perché build_py è una classe vecchio stile e non può essere utilizzata con super(). Ho usato 'build_py.byte_compile (self, files)'. (Ho anche rinominato la classe build_py in modo da non rovinare il build_py importato.) –

1

Prova questo:

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

Forse un codice di lavoro completo qui :)

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

"i comandi standard non hanno una tale opzione"?

Avete installato l'ultima versione di setuptools? E hai scritto un file setup.py?

In tal caso, questo dovrebbe funzionare: python setup.py bdist_egg --exclude-source-files.

+0

Ho notato nella domanda che sono riuscito a farlo per bdist_egg. Erano gli altri output (ad esempio zip) a mancare l'opzione. – Draemon

Problemi correlati