Imaginez que vous souhaitiez développer une application de bureau utilisateur non triviale (pas Web) en Python. Quelle est la meilleure façon de structurer la hiérarchie des dossiers du projet?
Les fonctionnalités souhaitables sont la facilité de maintenance, la convivialité IDE, l'adéquation pour le branchement / la fusion du contrôle de source et la génération facile de packages d'installation.
En particulier:
- Où mettez-vous la source?
- Où placez-vous les scripts de démarrage de l'application?
- Où placez-vous le projet IDE?
- Où placez-vous les tests unitaires / d'acceptation?
- Où placez-vous les données non-Python telles que les fichiers de configuration?
- Où placez-vous les sources non-Python telles que C ++ pour les modules d'extension binaires pyd / so?
Selon la structure du système de fichiers de Jean-Paul Calderone d'un projet Python :
la source
Project/project/
? Ah, le second est le nom du paquet.../
dans une instruction include)pip install -e /path/to/Project
)-e
indicateur, qui installe le package en tant que package modifiable, c'est-à-dire qu'il l'installe en tant que liens vers le dossier de projet réel. L'exécutable peut alors simplementimport project
avoir accès au module.Ce billet de blog de Jean-Paul Calderone est généralement donné comme réponse en #python sur Freenode.
la source
Découvrez Open Sourcing a Python Project de la bonne façon .
Permettez-moi d'extraire la partie mise en page du projet de cet excellent article:
la source
Makefile
au même niveau quesetup.py
? Donc, si je vous comprends,make env
automatise correctement la création d'un nouveauvenv
et installez-y les packages ...?La "Python Packaging Authority" a un exemple de projet:
https://github.com/pypa/sampleproject
Il s'agit d'un exemple de projet qui existe en tant qu'aide au didacticiel du Guide de l'utilisateur de Python Packaging sur les projets de conditionnement et de distribution.
la source
root/src/*
structure: github.com/pypa/sampleproject/commit/…Essayez de démarrer le projet en utilisant le modèle python_boilerplate . Il suit en grande partie les meilleures pratiques (par exemple celles ici ), mais est mieux adapté au cas où vous vous sentiriez prêt à diviser votre projet en plusieurs œufs à un moment donné (et croyez-moi, avec tout sauf les projets les plus simples, vous le ferez. situation courante est où vous devez utiliser une version modifiée localement de la bibliothèque de quelqu'un d'autre).
Où mettez-vous la source?
PROJECT_ROOT/src/<egg_name>
.Où placez-vous les scripts de démarrage de l'application?
entry_point
dans l'un des œufs.Où placez-vous le projet IDE?
PROJECT_ROOT/.<something>
la racine du projet, et c'est très bien.Où placez-vous les tests unitaires / d'acceptation?
PROJECT_ROOT/src/<egg_name>/tests
répertoire. Personnellement, je préfère utiliserpy.test
pour les exécuter.Où placez-vous les données non-Python telles que les fichiers de configuration?
pkg_resources
package desetuptools
, ou depuis Python 3.7 via leimportlib.resources
module de la bibliothèque standard.PROJECT_ROOT/config
. Pour le déploiement, il peut y avoir différentes options. Sous Windows, on peut utiliser%APP_DATA%/<app-name>/config
, sous Linux/etc/<app-name>
ou/opt/<app-name>/config
.PROJECT_ROOT/var
pendant le développement et sous/var
pendant le déploiement de Linux.PROJECT_ROOT/src/<egg_name>/native
La documentation irait généralement dans
PROJECT_ROOT/doc
ouPROJECT_ROOT/src/<egg_name>/doc
(cela dépend si vous considérez certains des œufs comme des grands projets séparés). Certaines configurations supplémentaires seront dans des fichiers commePROJECT_ROOT/buildout.cfg
etPROJECT_ROOT/setup.cfg
.la source
base_data_location
variable, mais comment la définissez-vous correctement?D'après mon expérience, c'est juste une question d'itération. Mettez vos données et votre code partout où vous pensez qu'ils vont. Il y a de fortes chances que vous vous trompiez de toute façon. Mais une fois que vous avez une meilleure idée de la façon dont les choses vont se former, vous êtes bien mieux placé pour faire ce genre de suppositions.
En ce qui concerne les sources d'extension, nous avons un répertoire Code sous trunk qui contient un répertoire pour python et un répertoire pour diverses autres langues. Personnellement, je suis plus enclin à essayer de mettre n'importe quel code d'extension dans son propre référentiel la prochaine fois.
Cela dit, je reviens à mon point de départ: n'en faites pas trop l'affaire. Mettez-le quelque part qui semble fonctionner pour vous. Si vous trouvez quelque chose qui ne fonctionne pas, il peut (et devrait) être modifié.
la source
Les données non python sont mieux regroupées dans vos modules Python en utilisant la
package_data
prise en charge de setuptools . Une chose que je recommande fortement est d'utiliser des packages d'espaces de noms pour créer des espaces de noms partagés que plusieurs projets peuvent utiliser - un peu comme la convention Java de placer des packagescom.yourcompany.yourproject
(et de pouvoir avoir uncom.yourcompany.utils
espace de noms partagé ).En ce qui concerne la ramification et la fusion, si vous utilisez un système de contrôle de source suffisamment bon, il gérera les fusions même via des renommages; Bazaar est particulièrement doué pour cela.
Contrairement à d'autres réponses ici, je suis +1 sur le fait d'avoir un
src
répertoire de niveau supérieur (avecdoc
ettest
répertoires à côté). Les conventions spécifiques pour les arborescences de répertoires de documentation varient en fonction de ce que vous utilisez; Sphinx , par exemple, a ses propres conventions que son outil de démarrage rapide prend en charge.S'il vous plaît, veuillez utiliser setuptools et pkg_resources; cela rend beaucoup plus facile pour d'autres projets de s'appuyer sur des versions spécifiques de votre code (et pour que plusieurs versions soient installées simultanément avec différents fichiers non-code, si vous utilisez
package_data
).la source