2010-01-09 5 views
0

J'ai une simple application python où ma structure de répertoire est la suivante:Distribution d'une application python

  • 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 j'ai pensé que j'utiliserais setuptools pour le faire. Le fichier que les utilisateurs sont censés utiliser est main.py, de sorte que l'on entre clairement dans/usr/bin et le reste des fichiers dans/usr/share/project.

Mais il y a un problème: je devrais d'une certaine manière dire à main.py de chercher config.py dans le répertoire de partage. Mais je ne peux pas vraiment savoir exactement où se trouve le répertoire de partage puisque c'est à setuptools, n'est-ce pas?

Quelle est la meilleure pratique pour distribuer des applications basées sur Python?

Répondre

11

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 votre main.py importe config.py cela fonctionne parce qu'ils vivent dans le même répertoire. lorsque vous déplacez votre main.py vers un autre emplacement comme /usr/bin ou un autre emplacement présent dans PATH variable d'environnement, python essayez d'importer config.py à partir de sys.path et non à partir de votre répertoire de package. la solution est d'utiliser l'importation absolue:

from project import config 

maintenant main.py est "mobile".

une autre solution, que je préfère, utilise la création de script automatique offerte 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", 
     ], 
    } 
) 

c'est tout.après une installation setuptools va créer un script wrapper qui est appelable du 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 le déplacer dans un répertoire bin/. notez que setuptools place 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#automatic-script-creation

+0

Je crois que je suis stupide, mais je ne vois pas comment cela est pertinent? Pourriez-vous élaborer? – pafcu

+0

Je pense que j'ai mal compris votre question. avez-vous besoin d'importer '/ usr/share/config.py'? ce n'est pas un bon moyen de laisser l'utilisateur personnaliser le comportement de votre application. une meilleure solution est un fichier de configuration par utilisateur comme '$ HOME/.projectrc' peut-être une configuration globale dans'/etc/'. Si c'est votre problème, je vais corriger ma réponse. –

+0

Oui, le problème est l'importation de config.py. Et dans la question je dis spécifiquement qu'il ne contient aucune information de configuration, il contient seulement l'implémentation pour charger les fichiers de configuration réels. C'est une partie du programme, pas un fichier de configuration ou un plugin. Pour être honnête, je ne comprends pas complètement la chose entry_points. Cela pourrait très bien être ce que je cherche, mais je trouve la documentation un peu confuse. – pafcu

Questions connexes