2011-05-04 8 views
1

J'ai un répertoire nommé ./foo dans mon projet qui contient un fichier __init__.py, qui contient une méthode nommée main().Buildout: utiliser un "package" comme point d'entrée?

Je voudrais utiliser buildout pour créer un exécutable qui exécutera la méthode main() (par exemple: ./bin/foo). J'ai accompli quelque chose de similaire au « haut niveau » de ma structure de répertoire en utilisant la section buildout.cfg suivante:

[bar] 
recipe = zc.recipe.egg 
eggs = ${buildout:eggs} 
entry-points = bar=bar:main 

Cela fonctionne bien pour mon fichier ./bar.py, la création d'un fichier exécutable ./bin/bar. Je n'arrive juste pas à le faire fonctionner pour le fichier ./foo/__init__.py.

Comment pourrais-je obtenir ce qui précède?

Répondre

1

Normalement, python trouve des modules et des paquets via le chemin python, via la variable sys.path. Lorsque buildout crée des scripts dans le répertoire bin/, il ajoute à la variable sys.path, listant tous les oeufs pour la partie donnée.

Pour que python trouve votre module ./bar.py, ou votre paquet ./foo, le répertoire courant doit aussi faire partie du chemin python. Je trouve très surprenant qu'un module bar.py soit trouvé pour bin/bar, alors que le paquet ./foo est introuvable; clairement les chemins python pour les deux parties sont différents. Vous pouvez regarder en haut des scripts bin/bar et générés pour voir quels chemins ont été ajoutés à sys.path.

Dans tous les cas, vous pouvez ajouter manuellement des chemins supplémentaires à sys.path avec l'option extra-paths dans la partie zc.recipe.egg. Tout chemin répertorié ici se retrouvera dans votre script généré. Il suffit de régler ceci à ${buildout:directory}:

[foo] 
recipe = zc.recipe.egg 
eggs = ${buildout:eggs} 
extra-paths = ${buildout:directory} 
entry-points = foo=foo:main 
Questions connexes