Distribution d'une application python
-
19-09-2019 - |
Question
J'ai une simple application python où ma structure de répertoire est la suivante:
- projet /
- main.py
- config.py
- plugins /
- plugin1
- plugin2
- ...
Config.py charge uniquement les fichiers de configuration, il ne contient pas d'informations de configuration en elle-même.
Je veux maintenant distribuer ce programme, et je pensais que j'utiliser setuptools de le faire. Les utilisateurs de fichiers sont censés utiliser est main.py, de sorte que l'on va clairement dans / usr / bin et le reste des fichiers aller dans / usr / share / projet.
Mais il y a un problème: il me faudrait en quelque sorte de dire main.py de chercher config.py dans le répertoire de partage. Mais je ne peux pas vraiment être sûr où exactement le répertoire de partage est depuis c'est à setuptools, droit?
Quelle est la meilleure pratique lors de la distribution des applications basées sur Python?
La solution
setuptools installer votre package dans un endroit qui est accessible à partir de Python dire que vous pouvez l'importer:
import project
l'augmentation du problème lorsque vous faites des importations par rapport au lieu des importations en termes absolus. si vos importations de main.py
config.py
cela fonctionne parce qu'ils vivent dans le même répertoire. lorsque vous déplacez votre main.py
à un autre endroit comme /usr/bin
ou un autre emplacement présent dans PATH variable d'environnement, python essayez d'importer config.py
de sys.path
et non de votre paquet dir. la solution est d'utiliser l'importation absolue:
from project import config
main.py
est "mobile".
Une autre solution, que je préfère, utilise la création de script automatique offert par setuptools .
au lieu d'avoir votre code dans un
if __name__ == "__main__":
# here all your beautiful code
déclaration, mettez votre code dans une fonction (principale pourrait être un bon nom):
def main():
# put your code here
if __name__ == "__main__": # not needed, just in case...
main()
maintenant modifier votre setup.py
:
setup(
# ...
entry_points = {
"console_scripts": [
# modify script_name with the name you want use from shell
# $ script_name [params]
"script_name = project.main:main",
],
}
)
qui est tout. après une installation setuptools créer un script enveloppe qui est appelable shell et qui appelle votre fonction principale. maintenant main.py
peut vivre dans votre répertoire de projet et vous n'avez plus besoin de se déplacer dans un répertoire de bin/
. noter que setuptools met automatiquement ce script dans le répertoire bin/
par rapport au préfixe d'installation.
es.
python setup.py install --prefix ~/.local
installer votre package de projet dans
~/.local/lib/python<version>/site-packages/<package_name>
et votre script dans
~/.local/bin/<script_name>
alors assurez-vous que ~/.local/bin
est présent dans votre PATH env.
Plus d'infos sur: http://peak.telecommunity.com/DevCenter / setuptools # automatique création de script