setup python3 python distutils

setup - install python3 distutils



¿Cómo extender distutils con un simple script de instalación posterior? (4)

Excavé a través de la fuente de distutils por un día para aprender lo suficiente sobre él y 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), ...)

Necesito ejecutar un script simple después de que los módulos y programas hayan sido instalados. Tengo problemas para encontrar documentación sencilla sobre cómo hacer esto. Parece que necesito heredar de distutils.command.install, anular algunos métodos y agregar este objeto al script de instalació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?


No pude hacer que la respuesta de Joe Wreschnig funcionara y ajusté su respuesta de forma análoga a la extensión de la documentation 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 ya que no estoy seguro de por qué su respuesta no estaba funcionando en mi máquina.


OK, lo descubrí. La idea es básicamente extender uno de los comandos de distutils y sobrescribir el método de ejecución. Para decirle a distutils que use 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 más.


Obtuve 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 ''pip install'':

sudo python setup.py install

falla con el error: error en setup.cfg: command ''my_install'' no tiene dicha opción ''single_version_externally_managed''

Y

sudo pip install . -U

falla más detalladamente pero también con error: opción --single-version-externally-managed no reconocida

Variación en la respuesta aceptada

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

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