Pour un projet Python3, j'essaie de coller au plus près de la structure de fichiers décrite par Jean-Paul Calderone; pour l'illustrer, je reprends un post dans un fil de discussion sur Stackoverflow :
Project/
|-- bin/
| |-- project
|
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- setup.py
|-- README
J'ai réécrit mon projet en tenant compte de cette structure; mes tests sont ok : nosetests
me donne bien les résultats escomptés. Paradoxalement, je n'arrive pas à lancer le programme au complet. D'après les indications de Calderone, le point d'entrée est situé dans un exécutable(ici, un script) placé dans bin/
et nommé, ici, project
; voici ce qu'il dit sur cet exécutable :
Don't give [it] a .py extension, even if [it's a] Python source [file]. Don't put any code in [it] except an import of and call to a main function defined somewhere else in your projects.
Que doit donc contenir ce fichier ? Pour le moment j'ai tenté un :
from ..project.main import main
main()
… mais appeler ce programme à l'aide de ./bin/project
me conduit à cette erreur :
SystemError: Parent module '' not loaded, cannot perform relative import
Voyez-vous comment je peux me sortir de ce mauvais pas ?
Merci d'avance !
```
# import erroné
Posté par NeoX . Évalué à 3.
j'y connais pas grand chose en python, faudrait que je m'y mette,
d'apres le message d'erreur, c'est un probleme avec l'import,
et de ce que je vois ton import comporte .. avant project, est-ce voulu ? est-ce toléré ?
dans les docs que j'ai pu lire, ce serait plutot sans les ..
[^] # Re: import erroné
Posté par Xavier Faure (site web personnel) . Évalué à 1.
Oui, les deux points sont acceptés. L'idée est que le script dans bin/ charge ../project/main.py::main() .
Trust the Python !
# réponse
Posté par Xavier Faure (site web personnel) . Évalué à 1. Dernière modification le 20 novembre 2015 à 20:10.
Ma réponse, donnée sur Stack Overflow.
En résumé, il est possible d'obtenir le résulat escompté en modifiant
sys.path
. Je me suis rendu compte que le script exécutable fonctionnait bien mais qu'il n'était pas nécessaire d'en faire le point d'entrée dans le programme, une fois celui-ci installé avec Pypi; Pypi sait en effet fabriquer un script seul, à partir du point d'entrée défini dans setup.py .Trust the Python !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.