Post-Install-Skript mit Python-Setup-Tools

Ist es möglich, eine Post-Install-Python-Skriptdatei als Teil der setuptools setup.py-Datei anzugeben, damit ein Benutzer den Befehl ausführen kann:

python setup.py install 

Auf einem lokalen Projektdateiverzeichnis oder

 pip install <name> 

Für ein PyPI-Projekt und das Skript wird nach Abschluss der Standard-Setup-Tools installiert werden? Ich schaue nach Post-Installationsaufgaben, die in einer einzigen Python-Skriptdatei codiert werden können (zB eine benutzerdefinierte Post-Installationsnachricht an den Benutzer abgeben, zusätzliche Datendateien aus einem anderen Remote-Quell-Repository ziehen).

Ich stieß auf diese SO-Antwort aus einigen Jahren , die das Thema adressiert und es klingt, als ob der Konsens zu diesem Zeitpunkt war, dass Sie einen Installationsunterbefehl erstellen müssen. Wenn das noch der Fall ist, wäre es möglich, dass jemand ein Beispiel dafür gibt, wie dies zu tun ist, so dass es nicht notwendig ist, dass der Benutzer einen zweiten Befehl einträgt, um das Skript auszuführen.

4 Solutions collect form web for “Post-Install-Skript mit Python-Setup-Tools”

Diese Lösung ist transparenter:

Sie werden ein paar Ergänzungen zu setup.py und es gibt keine Notwendigkeit, eine zusätzliche Datei.

Auch müssen Sie zwei verschiedene Nachinstallationen für den Entwicklungs- / Bearbeitungs- und Installationsmodus berücksichtigen.

Fügen Sie diese beiden Klassen enthält Ihre Post-Installation Skript zu setup.py :

 from setuptools import setup from setuptools.command.develop import develop from setuptools.command.install import install class PostDevelopCommand(develop): """Post-installation for development mode.""" def run(self): # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION develop.run(self) class PostInstallCommand(install): """Post-installation for installation mode.""" def run(self): # PUT YOUR POST-INSTALL SCRIPT HERE or CALL A FUNCTION install.run(self) 

Und cmdclass Argument zur setup() Funktion in setup.py ein :

 setup( ... cmdclass={ 'develop': PostDevelopCommand, 'install': PostInstallCommand, }, ... ) 

Sie können sogar Shell-Befehle bei der Nachinstallation aufrufen, so:

 from setuptools import setup from setuptools.command.develop import develop from setuptools.command.install import install from subprocess import check_call class PostDevelopCommand(develop): """Post-installation for development mode.""" def run(self): check_call("apt-get install this-package".split()) develop.run(self) class PostInstallCommand(install): """Post-installation for installation mode.""" def run(self): check_call("apt-get install this-package".split()) install.run(self) setup( ... 

PS gibt es keine Vorinstallation Einstiegspunkte auf setuptools. Lesen Sie diese Diskussion, wenn Sie sich fragen, warum es keine gibt.

Dies ist die einzige Strategie, die für mich gearbeitet hat, wenn das Post-Installations-Skript erfordert, dass die Paket-Abhängigkeiten bereits installiert wurden:

 import atexit from setuptools.command.install import install def _post_install(): print('POST INSTALL') class new_install(install): def __init__(self, *args, **kwargs): super(new_install, self).__init__(*args, **kwargs) atexit.register(_post_install) setuptools.setup( cmdclass={'install': new_install}, 

Eine Lösung könnte sein, um eine post_setup.py in das setup.py post_setup.py setup.py . post_setup.py enthält eine Funktion, die die Post-Installation und setup.py nur importieren und starten sie zur richtigen Zeit.

In setup.py :

 from distutils.core import setup from distutils.command.install_data import install_data try: from post_setup import main as post_install except ImportError: post_install = lambda: None class my_install(install_data): def run(self): install_data.run(self) post_install() if __name__ == '__main__': setup( ... cmdclass={'install_data': my_install}, ... ) 

In post_setup.py :

 def main(): """Do here your post-install""" pass if __name__ == '__main__': main() 

Mit der gemeinsamen Idee, setup.py aus seinem Verzeichnis zu starten, kannst du post_setup.py importieren, sonst wird eine leere Funktion gestartet.

In der post_setup.py können Sie mit der if __name__ == '__main__': Anweisung die Post-Installation von der Befehlszeile manuell starten.

Kombination der Antworten von @Apalala, @Zulu und @mertyildiran; Das hat für mich in einer Python 3.5 Umgebung gearbeitet:

 import atexit import os import sys from setuptools import setup from setuptools.command.install import install class CustomInstall(install): def run(self): def _post_install(): def find_module_path(): for p in sys.path: if os.path.isdir(p) and my_name in os.listdir(p): return os.path.join(p, my_name) install_path = find_module_path() # Add your post install code here atexit.register(_post_install) install.run(self) setup( cmdclass={'install': CustomInstall}, ... 

Dies gibt Ihnen auch den Zugriff auf den Installationspfad des Pakets in install_path , um eine Shell-Arbeit zu machen.

Python ist die beste Programmiersprache der Welt.