Python-Entwicklungsablauf mit Poetry, Git und Docker

Einführung

Dieser Artikel ist ein Schwesterartikel des zuvor geschriebenen Python-Entwicklungsablaufs mit pipenv, Git und Docker. Jetzt, da die Pipenv-Entwicklung nicht sehr aktiv ist, wird es sicher Gelegenheiten geben, in denen Poesie in Projekten verwendet wird, die Python verwenden. Daher möchte ich den Entwicklungsablauf mithilfe von Poetry neu organisieren.

Gesamtdurchfluss

  1. Installation der Entwicklungsumgebung
  2. Projektinitialisierung
  3. Docker

Voraussetzung Umgebung

Installation der Entwicklungsumgebung

Poesie-Installation

In den meisten Fällen können Sie es über den mit Ihrem Betriebssystem gelieferten Paketmanager installieren.

Für macOS

$ brew install poetry

Arch Linux

$ sudo pacman -S python-poetry

Ubuntu 18.04 Leider ist es nicht im Standard-Repository registriert. Installieren Sie es daher vom offiziellen Installationsprogramm.

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

Wenn die Installation abgeschlossen ist, geben Sie Ihren PFAD in "~ / .poetry / bin" ein. Fügen Sie abhängig von Ihrer Shell die folgenden Einstellungen zu ~ / .zshrc und ~ / .bashrc hinzu.

~/.bashrc


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

Einführung anderer Tools

Ich werde in Zukunft Git und Docker / Docker Compose verwenden, seien Sie also vorbereitet.

Python-Projekt initialisieren

Jetzt ist es Zeit, das Python-Projekt mit Poesie zu initialisieren.

Ein Projekt erstellen

Erstellen Sie zunächst ein entsprechendes Verzeichnis und legen Sie es dort ab.

$ mkdir sample-app
$ cd sample-app

Sie können das Projekt dann initialisieren, indem Sie "poet init" ausführen. Es ist interaktiv, also lassen Sie uns jeden beantworten. Sie werden gefragt, ob Sie die abhängigen Pakete unterwegs installieren möchten, aber dieses Mal möchte ich sie einzeln installieren, damit ich sie überspringe.

$ 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]

Wenn Sie die interaktive Umgebung verlassen, haben Sie "pyproject.toml". Damit ist die Projektinitialisierung abgeschlossen.

$  ls
pyproject.toml

Poesie Anfangseinstellungen

Normalerweise hat eine virtuelle Python-Umgebung, die unter "~ / Library / Caches / pypoetry / virtualenvs" oder "~ / .config / poet" erstellt wurde, das Verzeichnis ".venv" direkt unter dem Projektstamm, wenn die folgenden Einstellungen hinzugefügt werden. Wird erstellt und verwaltet dort die Python-Umgebung. Bitte stellen Sie ein, wie Sie möchten.

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

Bitte beachten Sie, dass diese Einstellung in poetry.toml anstelle von pyproject.toml aufgeführt ist.

Paket hinzufügen

Verwenden Sie in der Poetry-Umgebung "add", um Pakete wie bei npm hinzuzufügen. Lassen Sie uns eine Anwendung entwickeln, die FastAPI als Beispiel verwendet.

$ poetry add fastapi uvicorn

Wenn Sie ein Paket mit Poetry installieren, werden die zu diesem Zeitpunkt auflösbaren abhängigen Pakete und die Versionsinformationen jedes Pakets in "poetry.lock" geschrieben.

Pakete, die nur während der Entwicklung verwendet werden, werden mit der Option -D sowie mit npm installiert. Lassen Sie uns zum Beispiel den Code-Formatierer black installieren.

$ poetry add -D black

Wenn Sie die bisherigen Befehle ausführen, können Sie sehen, dass die bisher installierten Pakete zu den Abschnitten tool.poetry.dependencies und tool.poetry.dev-dependencies von pyproject.toml hinzugefügt wurden. ..

pyproject.toml


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

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

Installieren Sie das Paket von nun an jedes Mal nach Bedarf.

Git-Initialisierung

Initialisieren Sie als Nächstes Git, um dieses Projekt mit Git zu verwalten. Verwenden wir gitignore.io, um zuerst eine .gitignore-Datei zu erstellen. Dieses Mal werden wir Sie bitten, Python und virtualenv anzugeben. Wenn Sie zusätzliche Einstellungen für .gitignore benötigen, bearbeiten Sie diese bitte hier.

Sobald Sie .gitignore haben, initialisieren Sie Ihr Git-Repository, fügen Sie ungefähr alle Dateien hinzu und schreiben Sie fest.

$ 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"

So betreten Sie die virtuelle Umgebung

Verwenden Sie den Unterbefehl "shell", um die von Poetry erstellte virtuelle Python-Umgebung aufzurufen. Wenn Sie vergessen, die virtuelle Umgebung zu betreten, treten verschiedene Probleme auf, z. B. dass das installierte Paket nicht angezeigt werden kann. Überprüfen Sie es daher sorgfältig. Verwenden Sie zum Beenden den Befehl exit.

$ poetry shell
(.venv)$ exit

Docker

Nachdem wir das Poetry-Projekt erstellt haben, werden wir endlich an der Docker-Konvertierung arbeiten.

.Dockerignore vorbereiten

Dateien, die nicht übertragen werden müssen, sollten in ".dockerignore" eingegeben werden. Stellen Sie sicher, dass Sie es einschließen, insbesondere wenn Sie die .venv-Datei so festgelegt haben, dass sie sich im Projektstamm befindet. Außerdem ist es eine gute Idee, das Verzeichnis __pycache__ nicht zu übertragen.

.dockerignore


.venv/
__pycache__/

Dockerfile vorbereiten

Zum Schluss werde ich eine Docker-Datei schreiben. Dieses Mal werde ich die Methode mit Multi Stage Build vorstellen. Es ist in die Prozedur unterteilt, in der in der ersten Hälfte "require.txt" erstellt und in der zweiten Hälfte ein Docker-Image mit einer Python-Anwendung erstellt wird.

Der Grund, warum Sie dies zuerst tun müssen, ist, dass Sie Poetry installieren müssen, um poetry.lock zu lesen, aber Sie müssen Poetry nicht in den Container legen, in dem sich die Anwendung befindet, also möchten Sie sie trennen. Weil es eine Absicht gibt. Poesie hat die Fähigkeit, "require.txt" zu generieren, also werden wir es nutzen.

Zunächst aus der Erklärung der ersten Hälfte. Um die Caching-Strategie von Docker gut zu nutzen, installiere ich zuerst Poetry. Dies erspart Ihnen die Installation von Poetry bei jedem Build. Dann kopiert es einfach "pyproject.toml" und "poet.lock", um "require.txt" zu generieren.

Als nächstes folgt die Erklärung der zweiten Hälfte. Kopieren Sie die resultierende require.txt aus der ersten Hälfte und installieren Sie dann mit dem Befehl pip alle diese Pakete. Wenn diese Dateien unverändert bleiben, wird der Cache verwendet und die nächste Ebene wird automatisch erstellt, sodass Sie verhindern können, dass bei jedem Erstellen abhängige Pakete heruntergeladen werden. .. Dies ist eine empfohlene Konfiguration, da dadurch eine überwältigende Erstellungszeit eingespart werden kann. Übertragen Sie nach Abschluss der Installation verschiedene Python-Skripte und schreiben Sie die Befehle, die Sie ausführen möchten. Fertig.

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" ]

Es ist auch eine gute Idee, Docker Compose einzurichten. Es kann eine gute Idee sein, die lokale Datei für die Entwicklung bereitzustellen und dann die Einstellungen für das automatische Neuladen festzulegen.

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

So aktualisieren Sie das Paket

Sie können Poetry Update verwenden. Es wird jedoch nicht über die in pyproject.toml beschriebene Version hinaus aktualisiert. Seien Sie daher beim Upgrade der Hauptversionen vorsichtig.

So entfernen Sie ein Paket

Sie können es mit Poesie entfernen PACKAGE_NAME entfernen.

Wenn Sie von der Mitte an an der Entwicklung teilnehmen

Sie können das gesamte Entwicklungsabhängigkeitspaket mit "Poetry Install" installieren.

abschließend

Bisher haben wir den Entwicklungsablauf eines Python-Projekts mit Poetry erklärt. Sowohl in Poetry als auch in Pipenv denke ich, dass es durch die Verwendung von "Poetry.lock" möglich ist, den Versionsunterschied zwischen Entwicklern zu beseitigen und eine stabile Entwicklungsumgebung bereitzustellen. Es folgt auch dem von PEP vereinbarten Format, sodass es sich nicht schlecht für die Zukunft anfühlt.

Auf der anderen Seite habe ich den Eindruck, dass es sich eher um ein Projektmanagement-Tool für ** Python-Paketentwickler ** als um Python-Anwendungen handelt, z. B. weil die Skriptfunktion fehlt, mit der der mit Pipenv mögliche Einzeiler ausgeführt wird. Ich benutze es oft, um Lint und andere Tests auszuführen, aber diese Funktion.

Sowohl Poetry als auch Pipenv haben also ihre Vor- und Nachteile. Ich denke, es ist an dieser Stelle sicher, diejenige auszuwählen, die zu Ihrem Projekt passt. Ich hoffe ihr habt alle ein gutes Python-Leben.

Recommended Posts

Python-Entwicklungsablauf mit Poetry, Git und Docker
Entwickeln und Bereitstellen von Python-APIs mit Kubernetes und Docker
Verwalten Sie Python-Laufzeitpakete und Entwicklungsumgebungspakete mit Poetry
Authentifizierung mit Tweepy-User-Authentifizierung und Anwendungsauthentifizierung (Python)
Clustering und Visualisierung mit Python und CytoScape
Python 3-Socket-Modul und Socket-Kommunikationsfluss
Anwendungsentwicklung mit Docker + Python + Flask
Erstellen und testen Sie mit Docker in wenigen Minuten eine OpenCV- und Python-Umgebung
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Von Python bis zur Verwendung von MeCab (und CaboCha)
Python-Entwicklungsumgebung für macOS mit venv 2016
Verwenden von venv in der Windows + Docker-Umgebung [Python]
Hinter dem Flyer: Docker mit Python verwenden
Verwenden von Python und MeCab mit Azure Databricks
[FX] Hit oanda-API mit Python mit Docker
6 Python-Bibliotheken für schnellere Entwicklung und Debugging
Erstellen Sie eine Entwicklungsumgebung mit Jupyter und Flask mit Python in Docker (unterstützt sowohl VS Code als auch Code-Server).
Entwicklung und Bereitstellung der REST-API in Python mit Falcon Web Framework
Ich verwende Tox und Python 3.3 mit Travis-CI
Erstellen einer Python-Entwicklungsumgebung für Windows + gVim + Poetry
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Schätzung der Kopforientierung mit Python und OpenCV + dlib
Ich habe versucht, Web-Scraping mit Python und Selen
Hinweise zur Installation von Python3 und zur Verwendung von pip unter Windows7
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Python-Entwicklung unter Ubuntu unter AWS EC2 (mit Jupyter Lab)
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Holen Sie sich den Git-Zweignamen und den Tag-Namen mit Python
Erstellen Sie eine Webmap mit Python und GDAL
Python-Entwicklungsumgebung - Verwendung von Pyenv und Virtualenv-
[Python3] Automatische Texterzeugung mit janome und markovify
Versuchen Sie es mit Tensorflow. ① Erstellen Sie eine Python-Umgebung und führen Sie Tensorflow ein
Fortsetzung der Multi-Plattform-Entwicklung mit Electron und Python
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Holen Sie sich mit Poetry eine schnelle Python-Entwicklungsumgebung
Starten Sie Python
Python bei Docker
Scraping mit Python
Grundeinstellungen für die Verwendung von Python3.8 und pip unter CentOS8
Durchsuchen von Pixiv-Tags und Speichern von Illustrationen mit Python
Erweiterbare Skelette für Vim mit Python, Click und Jinja2
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python
Erstellen einer R- und Python Docker-Arbeitsumgebung
Senden und empfangen Sie Google Mail über die Google Mail-API mit Python
Implementieren eines Generators mit Python> Link> Yield und next ()> Yield
Entwickelt durch Installation von Git, VSCode, Docker unter Chrome OS
Lesen und Schreiben von Dateien mit Slackbot ~ Bot-Entwicklung mit Python ~
Aufbau der Python-Entwicklungsumgebung 2020 [Von der Python-Installation bis zur Einführung in die Poesie]
Holen Sie sich die ASP Datepicker-Steuerung mit Python und Selen und automatisieren Sie sie
Lesen und schreiben Sie NFC-Tags mit Python mit PaSoRi
Erstellen Sie eine Python-Entwicklungsumgebung mit pyenv unter MacOS
Sprachtranskriptionsverfahren mit Python und Google Cloud Speech API
Holen Sie sich Dateien von Linux mit paramiko und scp [Python]