¿Cómo extender distutils con un simple script de postinstalación?

Necesito ejecutar un script simple después de que se hayan instalado los módulos y progtwigs. Estoy teniendo problemas para encontrar documentación directa sobre cómo hacer esto. Parece que necesito heredar de distutils.command.install, anular algunos métodos y agregar este objeto a la secuencia de comandos de configuración. Los detalles son un poco confusos y parece un gran esfuerzo para un gancho tan simple. ¿Alguien sabe una manera fácil de hacer esto?

Busqué en la fuente de distutils durante un día para aprender lo suficiente como para hacer un montón de comandos personalizados. No es bonito, pero funciona.

import distutils.core from distutils.command.install import install ... class my_install(install): def run(self): install.run(self) # Custom stuff here # distutils.command.install actually has some nice helper methods # and interfaces. I strongly suggest reading the docstrings. ... distutils.core.setup(..., cmdclass=dict(install=my_install), ...) 

OK, lo he descubierto. La idea es básicamente extender uno de los comandos distutils y sobrescribir el método de ejecución. Para indicarle a los distritos que utilicen la nueva clase, puede usar la variable cmdclass.

 from distutils.core import setup from distutils.command.install_data import install_data class post_install(install_data): def run(self): # Call parent install_data.run(self) # Execute commands print "Running" setup(name="example", cmdclass={"install_data": post_install}, ... ) 

Espero que esto ayude a alguien mas

No pude hacer que la respuesta de Joe Wreschnig funcionara y modifiqué su respuesta de manera análoga a la extensión de la documentación de distutils. Se me ocurrió este código que funciona bien en mi máquina.

 from distutils import core from distutils.command.install import install ... class my_install(install): def run(self): install.run(self) # Custom stuff here # distutils.command.install actually has some nice helper methods # and interfaces. I strongly suggest reading the docstrings. ... distutils.core.setup(..., cmdclass={'install': my_install}) 

Nota: No edité la respuesta de Joe porque no estoy seguro de por qué su respuesta no funcionó en mi máquina.

Recibí un error cuando intenté la respuesta aceptada aquí (podría ser porque estoy usando Python 2.6 en este caso particular, no estoy seguro). Esto ocurrió tanto para ‘setup.py install’ como para ‘pip install’:

 sudo python setup.py install 

falla con error: error en setup.cfg: el comando ‘my_install’ no tiene tal opción ‘single_version_externally_managed’

Y

 sudo pip install . -U 

falla más verbalmente pero también con error: opción –single-version-externamente administrada no reconocida

Variación sobre la respuesta aceptada.

Reemplazar las importaciones de distutils con setuptools solucionó el problema para mí:

 from setuptools import setup from setuptools.command.install import install