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.
In den meisten Fällen können Sie es über den mit Ihrem Betriebssystem gelieferten Paketmanager installieren.
$ 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}
Ich werde in Zukunft Git und Docker / Docker Compose verwenden, seien Sie also vorbereitet.
Jetzt ist es Zeit, das Python-Projekt mit Poesie zu initialisieren.
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
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.
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.
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"
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
Nachdem wir das Poetry-Projekt erstellt haben, werden wir endlich an der Docker-Konvertierung arbeiten.
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__/
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
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.
Sie können es mit Poesie entfernen PACKAGE_NAME
entfernen.
Sie können das gesamte Entwicklungsabhängigkeitspaket mit "Poetry Install" installieren.
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