2009-09-18 19 views
7

Quiero que setup.py haga algunas acciones personalizadas además de instalar el paquete de Python (como instalar un script de init.d, crear directorios y archivos, etc.) Sé que puedo personalizar las clases de distutils/setuptools para hacer las mías comportamiento. El problema que tengo es que todo funciona cuando hago un cd al directorio del paquete y hago "instalación de python setup.py", pero parece que mis clases personalizadas no se ejecutan cuando hago "easy_install mypackage.tar.gz". Aquí está mi archivo setup.py (crear un archivo myfoobar.py vacío en el mismo directorio para probar):¿Cómo hacer que easy_install ejecute comandos personalizados en setup.py?

import setuptools 
from setuptools.command import install as _install 

class install(_install.install): 
    def initialize_options(self): 
     _install.install.initialize_options(self) 

    def finalize_options(self): 
     _install.install.finalize_options(self) 

    def run(self): 
     # Why is this never executed when tarball installed with easy_install? 
     # It does work with: python setup.py install 
     import pdb;pdb.set_trace() 
     _install.install.run(self) 

setuptools.setup(
    name = 'myfoobar', 
    version = '0.1', 
    platforms = ['any'], 
    description = 'Test package', 
    author = 'Someone', 
    py_modules = ['myfoobar'], 
    cmdclass = {'install': install}, 
) 

Lo mismo ocurre incluso si importo "configuración" y "instalación" de distutils. ¿Alguna idea de cómo podría hacer que easy_install ejecutara mis clases personalizadas?

Para aclarar, no quiero usar nada extra, como Buildout o Paver.

Respuesta

4

No se puede hacer. Enthought tiene una versión personalizada de setuptools que sí lo admite, pero de lo contrario está en el rastreador de errores como un elemento de la lista de deseos que se ha estado discutiendo desde junio.

Sin embargo, hay formas de engañar al sistema y puede considerarlas. Una forma es tener su módulo más importante, el que siempre se importa primero cuando usa su paquete, realizar las acciones posteriores a la instalación la primera vez que se lo llama. Luego debe limpiarse y considerar el caso donde no puede escribir en la biblioteca porque un administrador instaló el paquete y el primer usuario es alguien que no sea administrador.

En el peor de los casos, esto implicaría crear un directorio ~/.mypackage para cada usuario que use el paquete y volver a ejecutar postinstall una vez para cada nuevo usuario. Cada vez que se importa el módulo, comprueba la existencia de ~/.mypackage. Si no está allí, ejecuta el postinstall y lo crea. Si está allí, se salta el postinstall.

+0

No es la respuesta que esperaba, pero supongo que lo mejor que se puede dar, así que lo estoy otorgando como la respuesta. ¡Gracias! –

5

Paver lleva setuptools al siguiente nivel y le permite escribir tareas personalizadas. Le permite extender el archivo setup.py típico y proporciona una manera simple de iniciar el entorno Paver.

+0

Sé que podría usar algo extra, como Buildout, o parece Paver, para hacer esto, pero esto no es lo que estoy pidiendo. Imagine un paquete en PyPI que solo quiera que las personas puedan instalar con "easy_install package_name". –

+3

Paver se puede utilizar de tal forma que easy_install y 'python setup.py install' sigan funcionando como siempre. De hecho, Paver ni siquiera necesita instalarse si la configuración es correcta. Ver: http://packages.python.org/Paver/getting_started.html#but-people-are-used-to-setup-py –

Cuestiones relacionadas