J'ai créé un modèle de projet Python générique

J'utilise beaucoup Python, mais j'avais l'habitude de frapper le même code à chaque fois pour créer l'environnement. Cela prend beaucoup de temps et les parties à utiliser sont les mêmes, j'ai donc publié le référentiel en tant que modèle de projet pouvant être utilisé à des fins générales. https://github.com/odrum428/python_setup

Objectif

Quand j'ai commencé un projet Python, j'ai toujours entré les mêmes commandes, comme autour de CI et de documents.

C'est comme initialiser un projet à l'aide de Pipenv, définir CI, effectuer des tests et des peluches, et documenter avec Sphinx.

Il m'a fallu un certain temps pour les mettre en place à chaque fois, j'ai donc créé un modèle de projet dans le but de le configurer pour n'importe quel projet Python.

Il est conçu pour être compatible avec l'analyse, l'application et la génération de modèles.

Présentation de la configuration

paquet

Pipenv est utilisé pour la gestion des packages et de l'environnement. Les articles suivants sont organisés pour ces outils de gestion, j'espère donc que vous pourrez vous y référer. Comprendre les meilleures pratiques autour des packages Python

À l'heure actuelle, il est préférable d'utiliser pipenv et de gérer divers paramètres avec setup.py et setup.cfg. J'ai l'impression de l'utiliser, et c'est beaucoup plus facile à gérer et à construire.

Les packages utilisés dans le projet créé cette fois sont résumés.

En tant que système de lint de base, nous avons introduit ʻisort qui organise l'importation de paquets, etc. et flake8` qui organise le style de code. En plus de cela, il y a aussi «yapf», etc., mais j'ai adopté le PEP8 standard et en ai fait un «flocon8» confortable. Voici le code de la partie erreur C'est prêt à être fait.

Nous avons adopté pytest pour le test. Pour être honnête, si vous utilisez pytest pour les tests python, je pense qu'il n'y a pas de problème. Il y a beaucoup de choses que pytest peut faire par rapport à unittest standard, et c'est facile à manipuler.

De plus, ce modèle utilise Sphinx pour générer des documents. La documentation est générée à partir du code de test et de la docstring définis dans le dossier tests. En générant des documents uniquement à partir de cas de test, nous visons à écrire activement des cas de test et à enrichir les documents. Le thème de la documentation est sphinx-rtd-theme.

CI Nous avons également introduit CI en utilisant Circle CI. Exécutez Lint avec ʻisort et flake8pour conserver le style de code, et exécutez le code de test avecpytest`. «Tox», qui permet plusieurs versions d'exécution de test, et «pytest-randomly», qui rend les tests aléatoires, sont exclus car ils ne sont pas utilisés à des fins générales.

En plus de cela, nous avons également implémenté des mises à jour automatiques de la documentation. Lorsqu'il y a une mise à jour dans le dossier tests, CI met à jour le document et valide même Git.

  is_docs_update:
    steps:
      - run:
          name: check tests folder is updated
          command: |
            if [[ ! $(git diff --diff-filter=d --name-only HEAD | grep tests/ ) = '' ]]; then
              echo "build and deploy"
            else
                echo "no need docs update"
                circleci step halt
            fi
      - run:
          name: make rst file
          command: |
            pipenv run sphinx-apidoc -f -o docs/ tests/
      - run:
          name: make html
          command: |
            pipenv run sphinx-build -a ./docs ./docs/public
      - run:
          name: git push
          command: | 
            git config --global user.email [email protected]
            git config --global user.name odrum428
            git add -A
            git commit -m 'updating docs [skip ci]'
            git push origin HEAD

organisation des fichiers

La structure des fichiers est illustrée ci-dessous.

 ├ .circleci/
 ├ .envrc
 ├ .github/
 ├ .gitignore
 ├ docs/
 │  ├ Makefile
 │  ├ conf.py
 │  ├ index.rst
 │  ├ make.bat
 │  ├ modules.rst
 │  ├ public/
 │  └ tests.rst
 │
 ├ src/
 ├ tests/
 ├ LICENSE
 ├ Pipfile
 ├ Pipfile.lock
 ├ README.md
 ├ setup.cfg
 └ setup.py

J'ai facilement divisé la structure en source, test et document.

Le code d'application, l'apprentissage automatique, le code d'analyse, etc. sont tous gérés dans src d'une manière agréable. Écrivez le code de test avec la même structure de fichiers. La documentation est générée à partir du code de test. C'est une image comme.

À partir de là, je pense que nous devrions l'élargir en fonction de l'application.

Les packages et divers paramètres sont définis dans setup.cfg. Cela simplifie grandement le code et peut être écrit comme suit:

setup.py


from setuptools import setup

setup()

Le contenu réel des paramètres est défini dans setup.cfg.

[metadata]
name = sample-package
version = '1.0'
auther = Keita Mizushima
auther_email = [email protected]
description = sample repogitory of python
description-file = file: README.md
url = http://example.com
license = MIT
license_file = LICENSE

[options]
install_requires=
packages = find:

[flake8]
show_source = True
max-line-length=120
max-complexity=15

Comment utiliser

Enregistrez simplement un nouveau projet basé sur ce référentiel.

  1. Créez un référentiel GitHub.

Cette fois, j'ai créé un référentiel appelé nouveau_projet. image.png

  1. Démarrez un nouveau projet basé sur ce référentiel
git clone [email protected]:odrum428/python_setup.git new_poject
cd new_project
git remote set-url origin [email protected]:user_name/new_project.git
git push origin master

Vous pouvez maintenant créer un nouveau projet tout en reprenant ce référentiel.

3 Installez pipenv.

pip install pipenv

En prime, direnv bascule automatiquement entre les environnements virtuels, c'est donc recommandé! Vous n'êtes pas obligé d'activer l'environnement à chaque fois. https://github.com/direnv/direnv

Résumé

Je continuerai à le mettre à jour à chaque fois que l'environnement change, veuillez donc l'utiliser si vous avez des problèmes avec la configuration. De plus, je vous serais reconnaissant de bien vouloir nous donner un PR au référentiel.

https://github.com/odrum428/python_setup

Recommended Posts

J'ai créé un modèle de projet Python générique
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
Création d'une bibliothèque pour python capable de gérer facilement la division morphologique
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Fonctions pouvant être utilisées dans l'instruction for
Optimisation mathématique pour un travail gratuit avec Python + PuLP
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
Classe pour PYTHON qui peut être utilisée sans connaître LDAP
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Comment installer la bibliothèque Python qui peut être utilisée par les sociétés pharmaceutiques
J'ai créé une VM qui exécute OpenCV pour Python
Notes sur les connaissances Python utilisables avec AtCoder
[Django] À propos des utilisateurs pouvant être utilisés sur un modèle
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Puis-je être un data scientist?
Peut être utilisé avec AtCoder! Une collection de techniques pour dessiner du code court en Python!
[Atcoder] [C ++] J'ai fait un outil d'automatisation de test qui peut être utilisé pendant le concours
Étant donné que ImageDataGenerator ne peut plus être utilisé, une histoire sur la création d'une classe d'extension de données pour tensorflow> = 2.0
J'ai créé un outil pour générer automatiquement un diagramme de transition d'état pouvant être utilisé à la fois pour le développement Web et le développement d'applications
[Python] Créez un graphique qui peut être déplacé avec Plotly
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
[python] J'ai créé un diagramme de corrélation de suivi pour Twitter (édition Gremlin)
Résumé de l'entrée standard de Python pouvant être utilisée dans Competition Pro
Module standard Python utilisable en ligne de commande
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
Le modèle de projet Python auquel je pense.
J'ai créé un outil de mot de passe en Python.
À propos du fait que l'objet recompilé peut être utilisé pour le modèle re.match
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
Je voulais créer rapidement un serveur de messagerie utilisable librement avec postfix + dovecot sur EC2
Notes pour créer des figures pouvant être publiées dans des revues avec matplotlib
++ et-ne peuvent pas être utilisés pour incrémenter / décrémenter en python
J'ai créé un fichier de dictionnaire python pour Neocomplete
Je ne peux pas créer de projet avec Python3.5 (Windows) + django1.7.1.
[Python3] Code qui peut être utilisé lorsque vous souhaitez découper une image dans une taille spécifique
Création d'un wrapper Python pour l'API Qiita
Types de fichiers pouvant être utilisés avec Go
Un mémo que j'ai écrit un tri rapide en Python
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
Notes personnelles des opérations liées aux pandas qui peuvent être utilisées dans la pratique
Si vous souhaitez créer une application Windows (exe) qui peut être utilisée maintenant en utilisant uniquement Python
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
[Python] J'ai créé une application qui télécharge automatiquement le fichier audio de chaque mot utilisé pour l'application d'étude d'anglais.
J'ai essayé de créer un Dockerfile pour l'environnement de développement de Django
[Python] La chaîne de caractères f doit être utilisée pour incorporer la chaîne de caractères
Module de grattage "Gaspacho" qui peut être utilisé plus facilement que Beautiful Soup
Présentation et fonctionnalités utiles de scikit-learn qui peuvent également être utilisées pour l'apprentissage en profondeur
Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV
Résumé des méthodes d'analyse de données statistiques utilisant Python qui peuvent être utilisées en entreprise
[Python] Construire un environnement pour la programmation de compétition avec Atom (input () peut être utilisé!) [Mac]
Un modèle personnellement utilisé pour créer Discord BOT en Python (Notes)
Mettre en place un serveur FTP qui peut être créé et détruit immédiatement (en Python)
[Python] Introduction au scraping WEB | Résumé des méthodes pouvant être utilisées avec webdriver
J'ai essayé de faire une application mémo qui peut être pomodoro, mais un enregistrement de réflexion