Ich habe es heutzutage mit Gedichten versucht, weil die Installation von pipenv ziemlich langsam ist. Ich werde zusammenfassen, was ich gefunden habe, nachdem ich alles verwendet habe. Da ich Pipenv benutze, kann ich es damit vergleichen. Weitere Informationen finden Sie unter Offizielles Dokument, da hier keine paketbezogenen Befehle (Erstellen, Veröffentlichen ...) oder detaillierte Funktionen beschrieben werden.
Poetry ist ein Python-Paketverwaltungstool. Lösen Sie wie Pipenv die Abhängigkeiten und installieren / deinstallieren Sie Pakete. Mit der Datei poetry.lock können andere Benutzer das Paket mit der entsprechenden Version und den entsprechenden Abhängigkeiten installieren. Eine virtuelle Umgebung ist verfügbar und eine Verpackung ist ebenfalls möglich.
Python verwendet die von pyenv installierte.
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
PATH wird in ~. / Bash_profile
eingegeben und die Poesie startet.
$ poetry -V
Poetry version 1.0.2
Im Fall von pipenv wurde die Umgebungsvariable verwendet, um den Ordner ".venv" im Projekt festzulegen.
Pipenv
$ export PIPENV_VENV_IN_PROJECT=1
$ pipenv install...
Im Fall von Poesie wird aus "Poesiekonfiguration" gesetzt.
Sie können die aktuellen Einstellungen mit der Option --list
überprüfen. Der Standardwert ist "virtualenvs.in-project = false".
poetry
$ poetry config --list
cache-dir = "/home/user/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = false
virtualenvs.path = "{cache-dir}/virtualenvs" # /home/user/.cache/pypoetry/virtualenvs
Ändern Sie die Einstellungen.
python
$ poetry config virtualenvs.in-project true
$ poetry config --list
cache-dir = "/home/user/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs" # /home/user/.cache/pypoetry/virtualenvs
Starten Sie das Projekt mit "Poesie neu" und eine Vorlage wird generiert. Das Folgende ist gemäß Official Doc.
$ poetry new my-package
Created package my_package in my-package
Generiertes Briefpapier
my-package
├── pyproject.toml
├── README.rst
├── my_package
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
Das generierte pyproject.toml
ist wie folgt. Es scheint, dass pytest automatisch in dev-Abhängigkeiten enthalten ist.
pyproject.toml
[tool.poetry]
name = "my-package"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
Es ist jedoch schwierig, das Verzeichnis my_package in my-package zu verwenden. Sie können den Verzeichnisnamen im Paket mit der Option --name
ändern.
---- name
Option
$ poetry new my-package --name app
Created package app in my-package
Modell
my-package
├── pyproject.toml
├── README.rst
├── app
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
-- - src
Option
Es scheint eine --src
Option zu geben, aber es ist komplizierter, also benutze sie nicht.
$ poetry new --src my-package
Modell
├── pyproject.toml
├── README.rst
├── src
│ └── my_package
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
pyproject.toml
Wenn Sie keine Vorlage benötigen, können Sie nur "pyproject.toml" mit "Poesie" erstellen.
Bestimmen Sie interaktiv den Inhalt von pyproject.toml
wie npm init
.
$ poetry init
Package name [{folder_name}]:
Version [0.1.0]:
Description []:
Author [None, n to skip]: n
License []:
Compatible Python versions [^3.7]:
Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your dev dependencies (require-dev) interactively (yes/no) [yes] no
Generated file
[tool.poetry]
name = "new_ais"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]
[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] yes
Wenn Sie für den Paketnamen nichts eingeben, ist dies der Ordnername. Geben Sie j / n für Autor und Abhängigkeiten ein. Dadurch wird "pyproject.toml" im aktuellen Verzeichnis erstellt.
Wenn Sie es genauso wie Pipenv verwenden, scheint es einfacher zu sein, mit init zu beginnen.
install
poet install
löst wie pipenv install
Abhängigkeiten auf und installiert die erforderlichen Pakete aus der oben erstellten pyproject.toml
.
$ poetry new myapp
$ cd myapp
$ poetry install
reating virtualenv myapp in /home/user/workspace/poetry/myapp/.venv
Updating dependencies
Resolving dependencies... (0.5s)
Writing lock file
Package operations: 11 installs, 0 updates, 0 removals
- Installing more-itertools (8.1.0)
- Installing zipp (1.0.0)
- Installing importlib-metadata (1.4.0)
- Installing pyparsing (2.4.6)
- Installing six (1.14.0)
- Installing attrs (19.3.0)
- Installing packaging (20.0)
- Installing pluggy (0.13.1)
- Installing py (1.8.1)
- Installing wcwidth (0.1.8)
- Installing pytest (5.3.2)
- Installing myapp (0.1.0)
Bei der Installation wird eine poetry.lock
-Datei erstellt und Sie können die Abhängigkeiten sehen.
---- no-root
Option
Poesie installiert standardmäßig myapp. Um dies zu vermeiden, installieren Sie mit der Option "--no-root".
$ poetry install --no-root
---- no-dev
Option
Wenn Sie keine Dev-Abhängigkeiten installieren, ist die Option "--no-dev" in Ordnung.
$ poetry install --no-dev
add
Installieren Sie das Paket. Beachten Sie, dass es sich im Gegensatz zu Pipenv um ein Add handelt. Das Verriegeln ist schneller als das Pipenv.
$ poetry add django==2.2.8
Für Dev-Abhängigkeiten die Option --dev (-D)
.
$ poetry add flake8 -D
Wenn Sie die Option "--dry-run" verwenden, können Sie sehen, was installiert ist, ohne es zu installieren.
$ poetry add django --dry-run
Using version ^3.0.2 for django
Updating dependencies
Resolving dependencies... (0.4s)
Package operations: 4 installs, 0 updates, 0 removals, 13 skipped
- Skipping more-itertools (8.1.0) Already installed
- Skipping zipp (1.0.0) Already installed
- Skipping importlib-metadata (1.4.0) Already installed
- Skipping pyparsing (2.4.6) Already installed
- ...
update
Beim Aktualisieren der im Projekt installierten Pakete
$ poetry update
Individuell aktualisieren
$ poetry update requests django
Wie beim Hinzufügen können Sie den Inhalt des Updates mit der Option "--dry-run" anzeigen.
$ poetry update --dry-run
Updating dependencies
Resolving dependencies... (0.4s)
No dependencies to install or update
- Skipping more-itertools (8.1.0) Already installed
- Skipping zipp (1.0.0) Already installed
- Skipping importlib-metadata (1.4.0) Already installed
- Skipping pyparsing (2.4.6) Already installed
- Skipping six (1.14.0) Already installed
- Skipping atomicwrites (1.3.0) Not needed for the current environment
- ...
remove
Löschen Sie das installierte Paket.
$ poetry remove flask
Beachten Sie, dass in dev-Abhängigkeiten installierte Pakete die Option "--dev (-D)" erfordern.
$ poetry add flake8 -D
$ poetry remove flake8 # failed
[ValueError]
Package flake8 not found
$ poetry remove flake8 -D # OK
Sie können auch die Option "--dry-run" mit remove verwenden.
show
Zeigen Sie eine Liste der verfügbaren Pakete an.
Funktionen wie eine erweiterte Version von pip list
.
$ poetry show
asgiref 3.2.3 ASGI specs, helper code, and ada...
attrs 19.3.0 Classes Without Boilerplate
django 3.0.2 A high-level Python Web framewor...
entrypoints 0.3 Discover and load entry points f...
flake8 3.7.9 the modular source code checker:...
importlib-metadata 1.4.0 Read metadata from Python packages
mccabe 0.6.1 McCabe checker, plugin for flake8
more-itertools 8.1.0 More routines for operating on i...
packaging 20.0 Core utilities for Python packages
pluggy 0.13.1 plugin and hook calling mechanis...
...
Informationen zu Paketen können ebenfalls angezeigt werden.
$ poetry show django
name : django
version : 3.0.2
description : A high-level Python Web framework that
encourages rapid development and clean, pragmatic
design.
dependencies
- asgiref >=3.2,<4.0
- pytz *
- sqlparse >=0.2.2
---- Baum
Option
Abhängigkeiten können in einer Baumstruktur angezeigt werden. Eine ähnliche Funktion wie "pipenv graph". Eigentlich ist es leicht zu sehen, da es sich um eine farbige Ausgabe handelt.
$ poetry show --tree
django 3.0.2 A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
├── asgiref >=3.2,<4.0
├── pytz *
└── sqlparse >=0.2.2
flake8 3.7.9 the modular source code checker: pep8, pyflakes and co
├── entrypoints >=0.3.0,<0.4.0
├── mccabe >=0.6.0,<0.7.0
├── pycodestyle >=2.5.0,<2.6.0
└── pyflakes >=2.1.0,<2.2.0
...
---- neueste (-l)
Option
Zeigen Sie die neueste Version an.
$ poetry show --latest
asgiref 3.2.3 3.2.3 ASGI specs, helper code, a...
attrs 19.3.0 19.3.0 Classes Without Boilerplate
django 3.0.2 3.0.2 A high-level Python Web fr...
entrypoints 0.3 0.3 Discover and load entry po...
flake8 3.7.9 3.7.9 the modular source code ch...
importlib-metadata 1.4.0 1.4.0 Read metadata from Python ...
--- veraltete (-o)
Option
Ansicht älterer Pakete.
$ poetry show -o
django 2.2.4 3.0.2 A high-level Python Web framework that e...
lock
Sperren Sie die in pyproject.toml
angegebene Abhängigkeit. (Nicht installieren)
poetry.lock
wird generiert.
$ poetry lock
env
Befehle für die virtuelle Umgebung. Sie können 3.7.4 usw. im [Python] -Teil angeben.
$ poetry env info #Informationen zur aktuellen virtuellen Umgebung
$ poetry env list #Liste der virtuellen Umgebungen
$ poetry env remove <python> #Virtuelle Umgebung löschen
$ poetry env use <python> #Aktivieren oder erstellen Sie eine virtuelle Umgebung
In meiner Umgebung wurde "virtualenvs.in-project = true" nicht in der Liste angezeigt und das Entfernen funktionierte nicht. Es ist eine gute Idee, .venv / zu löschen.
shell
Starten Sie die Shell in der virtuellen Umgebung. Entspricht "pipenv shell".
$ poetry shell
scripts
Sie können das Skript ausführen, indem Sie Folgendes in pyproject.toml
eingeben.
pyproject.toml
[tool.poetry.scripts]
start = "script:main"
script.py
def main():
print("Run script with poetry!")
$ poetry run start
Run script with poetry!
Selbst wenn Sie die virtuelle Umgebung nicht betreten, wird sie in der virtuellen Umgebung ausgeführt, wenn Sie sie über ein Skript ausführen.
Betrachtet man den [ausführbaren Code für Skripte] der Poesie (https://github.com/python-poetry/poetry/blob/master/poetry/console/commands/run.py), so scheint es, dass keine Argumente übergeben werden können.
poetry/console/commands/run.py
#Ausführungscode für Gedichtskripte
def run_script(self, script, args):
if isinstance(script, dict):
script = script["callable"]
module, callable_ = script.split(":")
src_in_sys_path = "sys.path.append('src'); " if self._module.is_in_src() else ""
cmd = ["python", "-c"]
cmd += [
"import sys; "
"from importlib import import_module; "
"sys.argv = {!r}; {}"
"import_module('{}').{}()".format(args, src_in_sys_path, module, callable_) #Lauf
]
return self.env.execute(*cmd)
Mit den obigen Skripteinstellungen wird "import_module (" script "). Main ()" ausgeführt, sodass es überhaupt keinen Teil gibt, an dem Argumente übergeben werden können.
Ich habe in Pipenv oft start =" python manage.py runserver 0.0.0.0:8000 "
registriert, also war ich in Schwierigkeiten.
pyproject.toml
[tool.poetry.scripts]
start = "manage:main"
Wenn Sie dann "Poetry Run Start Runserver 0.0.0.0: 8000" einstellen, funktioniert dies. .. ..
-Gut (im Vergleich zu pipenv) Das Installieren, Hinzufügen, Entfernen und Sperren ist schneller (wichtig) als bei Pipenv, und die Anzeige auf der Konsole ist gut sichtbar. Die Funktionen, die "pip list" und "pipenv graph" entsprechen, sind ebenfalls ziemlich leicht zu erkennen.
-Perfekt (im Vergleich zu pipenv) Zusammenarbeit mit venv. Es kann mit der gleichen Benutzerfreundlichkeit wie Pipenv verwendet werden. (Ich mache mir Sorgen um das Verhalten zum Zeitpunkt von venv im Projekt) Es scheint keine Funktion zu geben, mit der pyenv über pipenv installiert werden kann, aber es ist in Ordnung, weil ich es nicht oft benutze.
-Bad (im Vergleich zu pipenv) Immerhin der Skriptteil. Es gab viele Probleme, also warte ich auf Verbesserungen. Ich habe das Gefühl, dass es viele Möglichkeiten gibt. Denk dran.
In Anbetracht der obigen Punkte scheint es, dass wir Poesie verwenden werden. Apropos Luxus, ich hätte wissen müssen, ob es Entwickler bei der "Poetry Show" war.
Recommended Posts