Forum Programmation.autre Python3 / import / Jean-Paul Calderone

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
0
20
nov.
2015

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  . É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 ..

    from project import main
    from project.sousproject import myfunction
  • # réponse

    Posté par  (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.