Flux de développement Python avec Poetry, Git et Docker

introduction

Cet article est un article sœur du [Flux de développement Python à l'aide de pipenv, Git et Docker] précédemment écrit (https://qiita.com/Aruneko/items/796d7eeb61e1f36ae4a0). Maintenant que le développement de Pipenv n'est pas très actif, je pense qu'il y aura des occasions où Poetry sera utilisé dans des projets qui utilisent Python. Par conséquent, je voudrais réorganiser le flux de développement en utilisant la poésie.

Flux global

  1. Installation de l'environnement de développement
  2. Initialisation du projet
  3. Docker

Environnement prérequis

Installation de l'environnement de développement

Installation de poésie

Dans la plupart des cas, vous pouvez l'installer à partir du gestionnaire de packages fourni avec votre système d'exploitation.

Pour macOS

$ brew install poetry

Arch Linux

$ sudo pacman -S python-poetry

Ubuntu 18.04 Malheureusement, il n'est pas enregistré dans le référentiel standard, alors installez-le à partir du programme d'installation officiel.

$ sudo apt install python3 python3-pip
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3

Lorsque l'installation est terminée, mettez votre PATH dans ~ / .poetry / bin. En fonction de votre shell, ajoutez les paramètres suivants à ~ / .zshrc et ~ / .bashrc.

~/.bashrc


export PATH=${HOME}/.poetry/bin:${PATH}

Introduction d'autres outils

J'utiliserai Git et Docker / Docker Compose à l'avenir, alors soyez prêt.

Initialiser le projet Python

Il est maintenant temps d'initialiser le projet Python en utilisant la poésie.

Créer un projet

Tout d'abord, créez un répertoire approprié et placez-le dedans.

$ mkdir sample-app
$ cd sample-app

Vous pouvez ensuite initialiser le projet en exécutant poetry init. C'est interactif, répondons donc à chacun. On vous demandera si vous souhaitez installer les paquets dépendants en cours de route, mais cette fois je veux les installer individuellement, donc je vais l'ignorer.

$ poetry init

This command will guide you through creating your pyproject.toml config.

Package name [sample_app]:
Version [0.1.0]:
Description []:  Sample App
Author [Aruneko <[email protected]>, n to skip]:
License []:  MIT
Compatible Python versions [^3.7]:

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file

[tool.poetry]
name = "sample_app"
version = "0.1.0"
description = "Sample App"
authors = ["Aruneko <[email protected]>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.7"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"


Do you confirm generation? (yes/no) [yes]

Lorsque vous quittez l'environnement interactif, vous aurez pyproject.toml. Ceci termine l'initialisation du projet.

$  ls
pyproject.toml

Paramètres initiaux de la poésie

Normalement, l'environnement virtuel Python créé sous ~ / Library / Caches / pypoetry / virtualenvs ou ~ / .config / poetry aura le répertoire .venv directement sous la racine du projet si les paramètres suivants sont ajoutés. Sera créé et y gérera l'environnement Python. Veuillez définir comme vous le souhaitez.

$ poetry config virtualenvs.in-project true --local

Veuillez noter que ce paramètre est répertorié dans poetry.toml au lieu de pyproject.toml.

Ajouter un package

Dans l'environnement Poetry, utilisez ʻadd` pour ajouter des packages comme avec npm. Développons une application qui utilise FastAPI comme exemple.

$ poetry add fastapi uvicorn

Lorsque vous installez un package avec Poetry, les packages dépendants qui peuvent être résolus à ce moment-là et les informations de version de chaque package sont écrits dans poetry.lock.

Les packages qui ne sont utilisés que pendant le développement sont installés avec l'option -D ainsi que npm. Par exemple, installons le formateur de code black.

$ poetry add -D black

En exécutant les commandes jusqu'à présent, vous pouvez voir que les packages installés jusqu'à présent ont été ajoutés aux sections tool.poetry.dependencies et tool.poetry.dev-dependencies de pyproject.toml. ..

pyproject.toml


[tool.poetry.dependencies]
python = "^3.7"
fastapi = "^0.52.0"
uvicorn = "^0.11.3"

[tool.poetry.dev-dependencies]
black = "^19.10b0"

À partir de maintenant, veuillez installer le package selon vos besoins à chaque fois.

Initialisation Git

Ensuite, initialisez Git pour gérer ce projet avec Git. Utilisons gitignore.io pour créer d'abord un fichier .gitignore. Cette fois, nous vous demanderons de spécifier Python et virtualenv. Si vous avez besoin de paramètres supplémentaires pour .gitignore, modifiez-le ici.

Une fois que vous avez .gitignore, initialisez votre dépôt Git, ajoutez à peu près tous les fichiers et validez.

$ curl -o .gitignore https://www.gitignore.io/api/python,virtualenv
$ git init
$ git add pyproject.toml poetry.lock poetry.toml .gitignore
$ git commit -m "Initial Commit"

Comment entrer dans l'environnement virtuel

Utilisez la sous-commande shell pour entrer dans l'environnement virtuel Python créé par Poetry. Si vous oubliez d'entrer dans l'environnement virtuel, divers problèmes tels que l'impossibilité de voir le paquet que vous auriez dû installer se produiront, alors assurez-vous de le vérifier attentivement. Pour quitter, utilisez la commande ʻexit`.

$ poetry shell
(.venv)$ exit

Docker

Maintenant que nous avons créé le projet Poetry, nous allons enfin travailler sur la conversion Docker.

Préparation du .dockerignore

Les fichiers qui n'ont pas besoin d'être transférés doivent être saisis dans .dockerignore. Assurez-vous de l'inclure, surtout si vous avez défini le fichier .venv pour qu'il soit à la racine du projet. De plus, c'est une bonne idée de ne pas transférer le répertoire __pycache__.

.dockerignore


.venv/
__pycache__/

Préparation du Dockerfile

Enfin, j'écrirai un Dockerfile. Cette fois, je présenterai la méthode utilisant Multi Stage Build. La procédure est divisée en la première moitié pour créer requirements.txt et la seconde moitié pour créer une image Docker avec une application Python.

La raison pour laquelle vous devez le faire en premier lieu est que vous devez installer Poetry pour lire poetry.lock, mais vous n'avez pas besoin de mettre Poetry dans le conteneur où l'application est placée, vous voulez donc les séparer. Parce qu'il y a une intention. La poésie a la capacité de générer requirements.txt, nous en profiterons donc.

Tout d'abord, de l'explication de la première moitié. Pour bien utiliser la stratégie de mise en cache de Docker, j'installe d'abord Poetry. Cela vous évitera d'avoir à installer Poetry sur chaque build. Ensuite, il copie simplement pyproject.toml et poetry.lock pour générer requirements.txt.

Vient ensuite l'explication de la seconde moitié. Copiez le requirements.txt résultant de la première moitié, puis utilisez la commande pip pour installer tous ces packages. Si ces fichiers restent inchangés, le cache sera utilisé et la couche suivante sera construite automatiquement, vous pouvez donc empêcher le comportement de téléchargement de packages dépendants à chaque fois que vous construisez. .. Il s'agit d'une configuration recommandée car elle peut gagner un temps de construction écrasant. Une fois l'installation terminée, transférez divers scripts Python et écrivez les commandes que vous souhaitez exécuter, et vous avez terminé.

FROM python:3.8-slim as builder

WORKDIR /usr/src/app

RUN pip install poetry

COPY pyproject.toml poetry.lock ./

RUN poetry export -f requirements.txt > requirements.txt


FROM python:3.8-slim

ENV PYTHONUNBUFFERED=1

WORKDIR /usr/src/app

COPY --from=builder /usr/src/app/requirements.txt .

RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000
CMD [ "uvicorn", "main:app", "--host", "0.0.0.0" ]

C'est également une bonne idée de configurer Docker Compose. Il peut être judicieux de monter le fichier local pour le développement, puis de définir les paramètres de rechargement automatique.

docker-compose.yml


version: '3'

services:
  app:
    build: .
    volumes:
      - ./:/usr/src/app
    ports:
      - "8000:8000"
    command: ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0"]

FAQ

Comment mettre à jour le package

Vous pouvez utiliser «mise à jour de la poésie». Cependant, il ne sera pas mis à jour au-delà de la version décrite dans pyproject.toml, donc soyez prudent lors de la mise à niveau des versions majeures.

Comment supprimer un package

Vous pouvez le supprimer avec poetry remove PACKAGE_NAME.

Si vous participez au développement par le milieu

Vous pouvez installer le package de dépendances de développement complet avec poetry install.

en conclusion

Jusqu'à présent, nous avons expliqué le flux de développement d'un projet Python utilisant Poetry. Dans Poetry ainsi que Pipenv, je pense qu'en utilisant poetry.lock, il est possible d'éliminer la différence de version entre les développeurs et de fournir un environnement de développement stable. Il suit également le format convenu par PEP, donc on a l'impression que ce n'est pas mal pour l'avenir.

D'un autre côté, j'ai l'impression qu'il s'agit d'un outil de gestion de projet pour ** développeurs de packages Python ** plutôt que pour des applications Python, comme par exemple l'absence de la fonction script qui exécute le one-liner qui était possible avec Pipenv. Je l'utilise beaucoup pour exécuter Lint et d'autres tests, mais cette fonctionnalité.

Ainsi, Poetry et Pipenv ont tous deux leurs avantages et leurs inconvénients. Je pense qu'il est prudent à ce stade de sélectionner celui qui convient à votre projet. J'espère que vous avez tous une bonne vie Python.

Recommended Posts

Flux de développement Python avec Poetry, Git et Docker
Développer et déployer des API Python à l'aide de Kubernetes et Docker
Gérez les packages d'exécution Python et les packages d'environnement de développement avec Poetry
Authentification à l'aide de l'authentification des utilisateurs tweepy et de l'authentification d'application (Python)
Clustering et visualisation à l'aide de Python et CytoScape
Module de socket Python 3 et flux de communication de socket
Développement d'applications avec Docker + Python + Flask
Créez et essayez un environnement OpenCV et Python en quelques minutes à l'aide de Docker
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
De Python à l'utilisation de MeCab (et CaboCha)
Environnement de développement Python pour macOS utilisant venv 2016
Utilisation de venv dans un environnement Windows + Docker [Python]
Derrière le flyer: utiliser Docker avec Python
Utilisation de Python et MeCab avec Azure Databricks
[FX] Hit oanda-API avec Python en utilisant Docker
6 bibliothèques Python pour un développement et un débogage plus rapides
Créer un environnement de développement à l'aide de Jupyter et Flask avec Python dans Docker (prend en charge à la fois VS Code / code-server)
Développement et déploiement de l'API REST en Python à l'aide de Falcon Web Framework
J'utilise tox et Python 3.3 avec Travis-CI
Création d'un environnement de développement Python pour Windows + gVim + Poetry
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Estimation de l'orientation de la tête avec Python et OpenCV + dlib
J'ai essayé le web scraping en utilisant python et sélénium
Remarques sur l'installation de Python3 et l'utilisation de pip sous Windows7
J'ai essayé la détection d'objets en utilisant Python et OpenCV
Développement Python sur Ubuntu sur AWS EC2 (à l'aide de Jupyter Lab)
[Python] Créer un environnement de développement Django avec Docker
Obtenez le nom de la branche git et le nom de la balise avec python
Créer une carte Web en utilisant Python et GDAL
environnement de développement python -utilisation de pyenv et virtualenv-
[Python3] Génération automatique de texte avec janome et markovify
Essayez d'utiliser tensorflow ① Créez un environnement python et introduisez tensorflow
Poursuite du développement multi-plateforme avec Electron et Python
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Obtenez un environnement de développement Python rapide avec Poetry
Commencez à utiliser Python
python chez docker
Scraping à l'aide de Python
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Recherche de balises pixiv et enregistrement d'illustrations à l'aide de Python
Squelettes extensibles pour Vim utilisant Python, Click et Jinja2
Essayez de créer un fichier compressé en utilisant Python et zlib
Structure de répertoire pour le développement piloté par les tests à l'aide de pytest en python
Création d'un environnement de travail Docker R et Python
Envoyez et recevez Gmail via l'API Gmail en utilisant Python
Implémentation d'un générateur en utilisant Python> link> yield et next ()> yield
Développé en installant Git, VSCode, Docker sur Chrome OS
Lire et écrire des fichiers avec Slackbot ~ Développement de bot avec Python ~
Construction de l'environnement de développement Python 2020 [De l'installation de Python à l'introduction à la poésie]
Obtenez et automatisez le contrôle ASP Datepicker à l'aide de Python et Selenium
Lire et écrire des balises NFC avec python en utilisant PaSoRi
Créer un environnement de développement Python à l'aide de pyenv sur MacOS
Procédure de transcription vocale à l'aide de Python et de l'API Google Cloud Speech
Récupérer des fichiers depuis Linux en utilisant paramiko et scp [Python]