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 Christophe B. (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 jihele . É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
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.
[^] # Re: Google est parfois ton ami
Posté par Christophe B. (site web personnel) . Évalué à 1.
Bon je parles un peu de ce que je ne connais pas
mais si tu dois developper un truc en python le mieux pour les autres
c'est l'install via pip
# .
Posté par saimn . É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.