2010-08-09 7 views
8

Quiero crear una distribución de solo bytecode de distutils (no realmente, lo hago; sé lo que estoy haciendo). Usando setuptools y el comando bdist_egg, simplemente puede proporcionar el parámetro --exclude-source. Lamentablemente, los comandos estándar no tienen esa opción.Cómo quitar la fuente de distutils distribuciones binarias?

  • ¿Hay una forma fácil de quitar los archivos de origen justo antes de que se creen tar.gz, zip, rpm o deb.
  • ¿Hay una forma relativamente limpia por comando para hacer esto (por ejemplo, solo para tar.gz o zip).
+1

Muy similar: http://stackoverflow.com/questions/261638/how-do-i-protect-python-code Los archivos python compilados (pyc/pyo) son bastante triviales para descompilar. –

+8

@Nick: en realidad no. No mencioné protección en absoluto, y esa pregunta no menciona distutils. Obviamente, el bytecode de python es fácil de analizar, ¿qué tal si nos dirigimos a la pregunta que realmente hice? – Draemon

+0

Si solo desea eliminar todos los archivos * .py de un zip: '7z d archive.zip * .py -r' –

Respuesta

11

El comando distutils "build_py" es el que importa, ya que es (indirectamente) reutilizado por todos los comandos que crean distribuciones. Si anula el byte_compile (archivos) método, algo así como:

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

Usted debe ser capaz de hacerlo de modo que los archivos de origen se eliminan del árbol de construcción antes de que se copian en el directorio "instalar" (que es un directorio temporal cuando los comandos bdist los invocan).

Nota: No he probado este código; YMMV.

+0

+1. Este es el tipo de cosa que esperaba. No me había dado cuenta de que había un build_py común en el que podía conectarme. Voy a intentar esto y ver si necesita algún ajuste. – Draemon

+1

+1 pero en Python 2.7.6 no funciona porque build_py es una clase de estilo antiguo y no se puede usar con super(). Usé 'build_py.byte_compile (self, files)' en su lugar. (También cambié el nombre de la clase build_py para que no molestara el build_py importado). –

1

Prueba esto:

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

Tal vez un código de trabajo completo aquí :)

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

"los comandos estándar no tienen esa opción"?

¿Tiene la última versión de setuptools instalada? ¿Y escribiste un archivo setup.py?

Si es así, debería funcionar: python setup.py bdist_egg --exclude-source-files.

+0

Noté en la pregunta que logré hacer esto para bdist_egg. Eran las otras salidas (por ejemplo, zip) que carecen de la opción. – Draemon

Cuestiones relacionadas