Forum Programmation.python Quelle arborescence pour un projet Python Qt ?

Posté par  . Licence CC By‑SA.
Étiquettes :
1
30
mar.
2015

Bonjour.

Je travaille sur une application PyQt (python + Qt) et je me demande comment organiser mon arborescence de fichiers. J'ai essayé de m'inspirer de projets libres, mais je n'ai pas trouvé la solution ultime. J'ai l'impression que chacun fait un peu à sa sauce.

Pour l'instant, je fais ceci:

mon_logiciel/
    .git/
    src/
        mon_logiciel.py
        mon_logiciel/
            mainwindow.py
            congif.py
            status_bar.py
            data.py
            mplwidget.py
            ...
            datareader/
                ...
            dataplotter/
                ...
        resources/
            ui/
                mainwindow.ui
                datareader/
                    ...
                dataplotter/
                    ...
            images/
        i18n/
            ts/
                mon_logiciel_fr.ts
    tests/
    doc/
    examples/
    tools/
        i18n/
            update_ts.py
            update_qm.py
        pylint/
            ...
    packages/
        win/
    .gitignore
    README.md
    LICENSE.txt
    VERSION
    TODO.txt
  • mon_logiciel.py ne contient que du code après le if name == "main". Il charge les traductions, instancie une MainWindow, et lance l'application. C'est donc par lui que je lance le logiciel.

  • mainwindow.py définit la classe MainWindow(QtGui.QtMainWindow) qui instancie la classe qui stocke les données (définie dans data.py) et crée la GUI, connecte les signaux, etc.

  • datareader/ contient des classes de lecture de données, qui servent à lire un format de fichier et stocker le contenu dans l'instance de classe de données attribut de MainWindow. L'utilisateur choisit un fichier via la GUI et la bonne classe est utilisée pour le parser selon son type.

  • dataplotter/ contient des classes de grahiques établis à partir de ces données. Chaque fichier crée une classe de graphique. Au démarrage, chaque grapheur est instancié dans un nouvel onglet de la GUI.

Je trouve logique d'appeler mon_logiciel en exécutant mon_logiciel.py, et pas main.py, par exemple. Je ne sais pas comment appeler le répertoire contenant les fichiers .py, donc je l'appelle mon_logiciel/ aussi.

Je ne crois pas que ce soit le meilleur agencement possible. Un indice, pylint se plaint d'imports circulaires à cause de mon_logiciel.py à côté de mon_logiciel/.

Peut-être que mon problème est plus profond: mauvaise séparation code/GUI.

Je n'ai pas trouvé de doc qui fasse référence, donc vos suggestions ou pointeurs sont les bienvenus.

Merci.

  • # Google est parfois ton ami

    Posté par  (site web personnel) . Évalué à 3.

    As tu vu cette page ?

    https://zestedesavoir.com/forums/sujet/1012/structure-dun-projet-et-du-code-avec-pyqt/

    Cela m'a l'air utile dans ton cas

    • [^] # Re: Google est parfois ton ami

      Posté par  . Évalué à 3.

      J'ai vu un certain nombre de page proposant des solutions mais aucune ne me satisfaisait tout à fait.

      Merci pour le lien, ça m'a donné quelques nouvelles pistes.

      Notamment, j'avais laissé de côté la création du setup.py mais il le faudra tôt ou tard donc autant l'inclure dans la réflexion.

      Une de mes difficultés, par exemple, c'est que j'aimerais pouvoir utiliser le logiciel "en place" dans le dépôt sans l'installer. Les solutions que j'ai trouvées utilisent un script dans bin/ pour lancer le logiciel. Le script fait un truc comme

      import mon_logiciel
      mon_logiciel.start()
      

      mais ça suppose que le logiciel est installé dans le path.

      Ou alors il faut faire une version comme ça pour l'install et une en chemin relatif pour les tests. Mais alors comme j'aimerais que ça fonctionne depuis Windows, ce n'est pas un script bash, c'est du python, et j'ai des soucis d'import en chemin relatif hors d'un module.

      Tout ça se résout d'une manière ou d'une autre mais j'ai l'impression de réinventer la roue pour un problème très commun, c'est pourquoi je posais une question très ouverte pour savoir si une solution ferait consensus. Visiblement, et c'est ce qui ressort de ma recherche, ce n'est pas le cas, ou alors il en existe une mais elle ne me convient pas et c'est moi qui ait un besoin non courant.

  • # .

    Posté par  . Évalué à 1.

    Voici quelques exemples pour la structure:
    https://github.com/kennethreitz/samplemod
    https://github.com/mapbox/pyskel
    http://blog.ionelmc.ro/2014/07/08/a-python-package-template/

    Il y a plusieurs possibilités:
    - soit mon_logiciel/mon_logiciel/{init,mon_logiciel,…}.py
    - soit mon_logiciel/{lib ou src}/mon_logiciel/{init,mon_logiciel,…}.py

    mon_logiciel.py doit être dans le répertoire des sources, et pour lancer ton soft en mode install ou développement tu te bases sur le setup.py avec les 'entry_points' (pour le dev, un virtualenv + python setup.py develop).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.