Come estendere distutils con un semplice script post-installazione?
Domanda
Devo eseguire un semplice script dopo aver installato i moduli e i programmi.Ho qualche problema a trovare documentazione semplice su come eseguire questa operazione.Sembra che debba ereditare da distutils.command.install, sovrascrivere alcuni metodi e aggiungere questo oggetto allo script di installazione.I dettagli però sono un po' confusi e sembra un grande sforzo per un hook così semplice.Qualcuno conosce un modo semplice per farlo?
Soluzione
Ho scavato attraverso fonte distutils per una giornata per imparare abbastanza per fare un mucchio di comandi personalizzati. Non è bello, ma funziona.
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), ...)
Altri suggerimenti
OK, ho capito. L'idea è sostanzialmente quella di estendere uno dei comandi Distutils e sovrascrivere il metodo run. A dire distutils per utilizzare la nuova classe è possibile utilizzare la variabile 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},
...
)
Spero che questo vi aiuterà a qualcun altro.
Non ho potuto fare Joe Wreschnig s lavoro risposta e ottimizzato la sua risposta analoga a Distutils estendono documentazione . Sono venuto con questo codice che funziona bene sulla mia macchina.
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:. Non ho modificare la risposta di Joe da quando sono incerto perché la sua risposta non funzionava sulla mia macchina
Ho ricevuto un errore quando ho provato la risposta accettata qui (potrebbe essere perché sto usando Python 2.6 in questo caso particolare, non ne sono sicuro).Ciò si è verificato sia per "setup.py install" che per "pip install":
sudo python setup.py install
fallisce con errore:errore in setup.cfg:il comando 'my_install' non ha l'opzione 'single_version_externally_activate'
E
sudo pip install . -U
fallisce in modo più prolisso ma anche con errore:opzione --versione singola gestita esternamente non riconosciuta
Variazione sulla risposta accettata
Sostituzione delle importazioni da distutils con setuptools mi ha risolto il problema:
from setuptools import setup
from setuptools.command.install import install