Ist es möglich, eine Python-Skriptdatei nach der Installation als Teil der Datei setuptools setup.py anzugeben, damit ein Benutzer den folgenden Befehl ausführen kann:
python setup.py install
in einem lokalen Projektdateiarchiv oder
pip install <name>
für ein PyPI-Projekt und das Skript wird nach Abschluss der Standard-Setuptools-Installation ausgeführt? Ich möchte Aufgaben nach der Installation ausführen, die in einer einzelnen Python-Skriptdatei codiert werden können (z. B. eine benutzerdefinierte Nachricht nach der Installation an den Benutzer senden, zusätzliche Datendateien aus einem anderen Remote-Quell-Repository abrufen).
Ich bin auf diese SO-Antwort von vor einigen Jahren gestoßen , die sich mit dem Thema befasst, und es scheint, als ob der damalige Konsens darin bestand, dass Sie einen Unterbefehl zur Installation erstellen müssen. Wenn dies immer noch der Fall ist, kann dann jemand ein Beispiel dafür angeben, damit der Benutzer keinen zweiten Befehl eingeben muss, um das Skript auszuführen?
quelle
Antworten:
Hinweis: Die folgende Lösung funktioniert nur, wenn Sie eine Quellverteilungs-Zip oder einen Tarball installieren oder im bearbeitbaren Modus über einen Quellbaum installieren. Es funktioniert nicht bei der Installation von einem binären Rad (
.whl
)Diese Lösung ist transparenter:
Sie werden einige Ergänzungen vornehmen
setup.py
und es ist keine zusätzliche Datei erforderlich.Außerdem müssen Sie zwei verschiedene Nachinstallationen berücksichtigen. eine für den Entwicklungs- / Bearbeitungsmodus und die andere für den Installationsmodus.
Fügen Sie diese beiden Klassen hinzu, die Ihr Skript nach der Installation enthalten
setup.py
:und fügen Sie ein
cmdclass
Argument ein, umsetup()
in zu funktionierensetup.py
:Sie können sogar Shell-Befehle während der Installation aufrufen, wie in diesem Beispiel, in dem die Vorbereitung vor der Installation durchgeführt wird:
PS: Auf setuptools sind keine Einstiegspunkte vor der Installation verfügbar. Lesen Sie diese Diskussion, wenn Sie sich fragen, warum es keine gibt.
quelle
install
Befehl aus?run
das übergeordnete Element aufrufen, ist Ihr Befehl eine Nachinstallation, andernfalls eine Vorinstallation. Ich habe die Antwort aktualisiert, um dies widerzuspiegeln.install_requires
Abhängigkeiten ignoriert zu werdenpip3
. Das Installationsskript wurde beim Veröffentlichen des Pakets ausgeführt, jedoch nicht bei der Installation.Hinweis: Die folgende Lösung funktioniert nur, wenn Sie eine Quellverteilungs-Zip oder einen Tarball installieren oder im bearbeitbaren Modus über einen Quellbaum installieren. Es funktioniert nicht bei der Installation von einem binären Rad (
.whl
)Dies ist die einzige Strategie, die für mich funktioniert hat, wenn das Skript nach der Installation erfordert, dass die Paketabhängigkeiten bereits installiert wurden:
quelle
atexit
Handler, anstatt nach dem Installationsschritt einfach die Post-Install-Funktion aufzurufen?setuptools
ist ziemlich unterdokumentiert . Andere haben ihre Antworten auf diese Fragen und Antworten bereits mit den richtigen Lösungen geändert.atexit
und definiere nicht neuinstall.run()
(dies ist der Grund, warum die Abhängigkeiten nicht mehr behandelt werden). Um das Installationsverzeichnis zu kennen, habe ich_post_install()
außerdem eine Methode angegebennew_install
, mit der ich aufself.install_purelib
und zugreifen kannself.install_platlib
(ich weiß nicht, welches ich verwenden soll, aber esself.install_lib
ist seltsamerweise falsch).Hinweis: Die folgende Lösung funktioniert nur, wenn Sie eine Quellverteilungs-Zip oder einen Tarball installieren oder im bearbeitbaren Modus über einen Quellbaum installieren. Es funktioniert nicht bei der Installation von einem binären Rad (
.whl
)Eine Lösung könnte darin bestehen, ein
post_setup.py
Insetup.py
-Verzeichnis aufzunehmen.post_setup.py
enthält eine Funktion, die die Nachinstallation ausführt undsetup.py
diese nur zum richtigen Zeitpunkt importiert und startet.In
setup.py
:In
post_setup.py
:Mit der allgemeinen Idee,
setup.py
aus dem Verzeichnis zu starten , können Sie importieren,post_setup.py
andernfalls wird eine leere Funktion gestartet.In
post_setup.py
derif __name__ == '__main__':
Anweisung können Sie die Nachinstallation manuell über die Befehlszeile starten.quelle
run()
dazu , dass die Paketabhängigkeiten nicht installiert werden.cmdclass
ersetzt wurde, ich habe das behoben.post_install()
nach dem laufen,install_data.run(self)
sonst werden Sie einige Sachen vermissen. Wiedata_files
zumindest. Vielen Dank, Kynan.install_data
in meinem Fall nicht ausgeführt. Hat es nichtatexit
den Vorteil, dass das Skript nach der Installation in jeder Situation am Ende ausgeführt wird?Kombinieren der Antworten von @Apalala, @Zulu und @mertyildiran; Dies funktionierte für mich in einer Python 3.5-Umgebung:
Auf diese Weise können Sie auch auf den Installationspfad des Pakets zugreifen
install_path
, um einige Shell-Arbeiten auszuführen.quelle
Ich denke, der einfachste Weg, die Nachinstallation durchzuführen und die Anforderungen beizubehalten, besteht darin, den Aufruf zu dekorieren
setup(...)
:Dies wird
setup()
beim Deklarieren ausgeführtsetup
. Sobald die Installation der Anforderungen abgeschlossen ist, wird die_post_install()
Funktion ausgeführt, die die innere Funktion ausführt_post_actions()
.quelle
Wenn Sie atexit verwenden, müssen Sie keine neue cmdclass erstellen. Sie können einfach Ihr atexit-Register direkt vor dem Aufruf von setup () erstellen. Es macht das Gleiche.
Wenn Abhängigkeiten zuerst installiert werden müssen, funktioniert dies bei der Pip-Installation nicht, da Ihr atexit-Handler aufgerufen wird, bevor pip die Pakete an ihren Platz verschiebt.
quelle
Ich konnte ein Problem mit den vorgelegten Empfehlungen nicht lösen. Deshalb hat mir Folgendes geholfen.
Sie können Funktion aufrufen, dass Sie nach der Installation ausgeführt werden soll kurz nach
setup()
insetup.py
, wie folgt aus:quelle