Est-il possible de spécifier un fichier de script Python post-installation dans le cadre du fichier setuptools setup.py afin qu'un utilisateur puisse exécuter la commande:
python setup.py install
sur une archive de fichier de projet locale, ou
pip install <name>
pour un projet PyPI et le script sera exécuté à la fin de l'installation standard de setuptools? Je cherche à effectuer des tâches de post-installation qui peuvent être codées dans un seul fichier de script Python (par exemple, livrer un message de post-installation personnalisé à l'utilisateur, extraire des fichiers de données supplémentaires à partir d'un référentiel source distant différent).
Je suis tombé sur cette réponse SO d'il y a plusieurs années qui aborde le sujet et il semble que le consensus à l'époque était que vous deviez créer une sous-commande d'installation. Si tel est toujours le cas, serait-il possible pour quelqu'un de fournir un exemple de la façon de procéder afin qu'il ne soit pas nécessaire que l'utilisateur saisisse une deuxième commande pour exécuter le script?
la source
Réponses:
Remarque: La solution ci-dessous ne fonctionne que lors de l'installation d'un zip ou d'une tarball de distribution source, ou lors de l'installation en mode modifiable à partir d'une arborescence source. Cela ne fonctionnera pas lors de l'installation à partir d'une roue binaire (
.whl
)Cette solution est plus transparente:
Vous allez faire quelques ajouts à
setup.py
et il n'y a pas besoin d'un fichier supplémentaire.Vous devez également considérer deux post-installations différentes; un pour le mode développement / modifiable et l'autre pour le mode installation.
Ajoutez ces deux classes qui incluent votre script de post-installation à
setup.py
:et insérez l'
cmdclass
argument poursetup()
fonctionner danssetup.py
:Vous pouvez même appeler des commandes shell pendant l'installation, comme dans cet exemple qui fait la préparation de pré-installation:
PS il n'y a aucun point d'entrée de pré-installation disponible sur setuptools. Lisez cette discussion si vous vous demandez pourquoi il n'y en a pas.
la source
install
commande réelle ?run
le parent d' abord , votre commande est un post-installation, sinon il est une pré-installation. J'ai mis à jour la réponse pour refléter cela.install_requires
dépendances soient ignoréespip3
. Le script d'installation s'est exécuté lors de la publication du package, mais pas lors de son installation.Remarque: La solution ci-dessous ne fonctionne que lors de l'installation d'un zip ou d'une tarball de distribution source, ou lors de l'installation en mode modifiable à partir d'une arborescence source. Cela ne fonctionnera pas lors de l'installation à partir d'une roue binaire (
.whl
)C'est la seule stratégie qui a fonctionné pour moi lorsque le script de post-installation nécessite que les dépendances de package aient déjà été installées:
la source
atexit
gestionnaire plutôt que d'appeler simplement la fonction de post-installation après l'étape d'installation?setuptools
est assez peu documenté. D'autres ont déjà modifié leurs réponses à cette Q&R avec les bonnes solutions.atexit
et je ne redéfinirai pasinstall.run()
(c'est la raison pour laquelle les dépendances ne sont plus gérées). De plus, afin de connaître le répertoire d'installation, j'ai mis_post_install()
comme méthode denew_install
, ce qui me permet d'accéder àself.install_purelib
etself.install_platlib
(je ne sais pas lequel utiliser, maisself.install_lib
c'est faux, bizarrement).Remarque: La solution ci-dessous ne fonctionne que lors de l'installation d'un zip ou d'une tarball de distribution source, ou lors de l'installation en mode modifiable à partir d'une arborescence source. Cela ne fonctionnera pas lors de l'installation à partir d'une roue binaire (
.whl
)Une solution pourrait être d'inclure un
post_setup.py
danssetup.py
le répertoire.post_setup.py
contiendra une fonction qui effectue la post-installation etsetup.py
ne l'importera et la lancera qu'au moment opportun.Dans
setup.py
:Dans
post_setup.py
:Avec l'idée commune de lancer
setup.py
depuis son répertoire, vous pourrez importerpost_setup.py
sinon il lancera une fonction vide.Dans
post_setup.py
, l'if __name__ == '__main__':
instruction vous permet de lancer manuellement la post-installation à partir de la ligne de commande.la source
run()
entraîne la non-installation des dépendances du package.cmdclass
été remplacé, j'ai corrigé ce problème .post_install()
après l'install_data.run(self)
autre , vous allez manquer des choses. Commedata_files
au moins. Merci kynan.install_data
n'est pas exécutée dans mon cas. Alors, n'a-t-il pasatexit
l'avantage de s'assurer que le script de post-installation sera exécuté à la fin, dans n'importe quelle situation?Combinant les réponses de @Apalala, @Zulu et @mertyildiran; cela a fonctionné pour moi dans un environnement Python 3.5:
Cela vous donne également accès au chemin d'installation du package dans
install_path
, pour effectuer des travaux sur le shell.la source
Je pense que le moyen le plus simple d'effectuer la post-installation et de conserver les exigences est de décorer l'appel à
setup(...)
:Cela fonctionnera
setup()
lors de la déclarationsetup
. Une fois terminé l'installation des exigences, il exécutera la_post_install()
fonction, qui exécutera la fonction interne_post_actions()
.la source
Si vous utilisez atexit, il n'est pas nécessaire de créer une nouvelle cmdclass. Vous pouvez simplement créer votre registre atexit juste avant l'appel setup (). Cela fait la même chose.
De plus, si vous avez besoin d'installer d'abord les dépendances, cela ne fonctionne pas avec pip install car votre gestionnaire atexit sera appelé avant que pip ne mette les packages en place.
la source
Je n'ai pas pu résoudre un problème avec les recommandations présentées, alors voici ce qui m'a aidé.
Vous pouvez appeler la fonction que vous souhaitez exécuter après l' installation juste après
setup()
danssetup.py
, comme ça:la source