J'ai essayé la poésie ces jours-ci car l'installation de pipenv est assez lente. Je vais résumer ce que j'ai trouvé après l'avoir utilisé partout. Puisque j'utilise Pipenv, je peux le comparer à cela. Veuillez vous référer au Official Doc car il ne décrit pas les commandes liées aux paquets (construire, publier ...) ou les fonctions détaillées.
Poetry est un outil de gestion de packages Python. Comme Pipenv, résolvez les dépendances et installez / désinstallez les packages Le fichier poetry.lock permet aux autres utilisateurs d'installer le package avec la version et les dépendances appropriées. Un environnement virtuel est disponible et un packaging est également possible.
Python utilise celui installé par pyenv.
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
PATH est entré dans ~. / Bash_profile
et la poésie démarre.
$ poetry -V
Poetry version 1.0.2
Dans le cas de pipenv, la variable d'environnement a été utilisée pour définir le dossier .venv
dans le projet.
Pipenv
$ export PIPENV_VENV_IN_PROJECT=1
$ pipenv install...
Dans le cas de la poésie, défini à partir de «poetry config».
Vous pouvez vérifier les paramètres actuels avec l'option --list
. La valeur par défaut est 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
Modifiez les paramètres.
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
Démarrez le projet avec "poetry new" et un modèle sera généré. Ce qui suit est conforme au document officiel.
$ poetry new my-package
Created package my_package in my-package
Papeterie générée
my-package
├── pyproject.toml
├── README.rst
├── my_package
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
Le "pyproject.toml" généré est le suivant. Il semble que pytest soit automatiquement inclus dans les dépendances dev.
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"
Cependant, il est difficile d'utiliser le répertoire my_package dans my-package. Vous pouvez changer le nom du répertoire dans le package avec l'option --name
.
Option ---- nom
$ poetry new my-package --name app
Created package app in my-package
Modèle
my-package
├── pyproject.toml
├── README.rst
├── app
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
Option -- - src
Il semble y avoir une option --src
, mais c'est plus compliqué, alors ne l'utilisez pas.
$ poetry new --src my-package
Modèle
├── pyproject.toml
├── README.rst
├── src
│ └── my_package
│ └── __init__.py
└── tests
├── __init__.py
└── test_my_package.py
pyproject.toml
Si vous n'avez pas besoin d'un modèle, vous ne pouvez créer que pyproject.toml
avec de la poésie dedans
.
Déterminez de manière interactive le contenu de «pyproject.toml» comme «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
Si vous n'entrez rien pour le nom du package, ce sera le nom du dossier. Entrez o / n pour l'auteur et les dépendances. Cela créera pyproject.toml
dans le répertoire courant.
Si vous l'utilisez de la même manière que Pipenv, il semble plus facile de démarrer avec init.
install
poetry install
, comme pipenv install
, résout les dépendances et installe les packages requis à partir du pyproject.toml
créé ci-dessus.
$ 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)
Lorsque vous installez, un fichier poetry.lock
est créé et vous pouvez voir les dépendances.
Option ---- sans racine
poetry installe myapp par défaut. Pour éviter cela, installez avec l'option --no-root
.
$ poetry install --no-root
Option ---- no-dev
Si vous n'installez pas les dépendances dev, l'option --no-dev
est OK.
$ poetry install --no-dev
add
Installez le package. Notez que contrairement à Pipenv, il s'agit d'un ajout. Le verrouillage est plus rapide que pipenv.
$ poetry add django==2.2.8
Pour les dépendances dev, l'option --dev (-D)
.
$ poetry add flake8 -D
Si vous utilisez l'option --dry-run
, vous pouvez voir ce qui est installé sans l'installer.
$ 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
Lors de la mise à jour des packages installés dans le projet
$ poetry update
Mettre à jour individuellement
$ poetry update requests django
Comme avec add, vous pouvez voir le contenu de la mise à jour avec l'option --dry-run
.
$ 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
Supprimez le package installé.
$ poetry remove flask
Notez que les packages installés dans les dépendances de développement nécessitent l'option --dev (-D)
.
$ poetry add flake8 -D
$ poetry remove flake8 # failed
[ValueError]
Package flake8 not found
$ poetry remove flake8 -D # OK
Vous pouvez également utiliser l'option --dry-run
avec remove.
show
Affichez une liste des packages disponibles.
Des fonctionnalités comme une version améliorée de 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...
...
Des informations sur les packages peuvent également être affichées.
$ 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
Option ---- arbre
Les dépendances peuvent être affichées dans une structure arborescente. Une fonction similaire à pipenv graph
. En fait, c'est facile à voir car c'est une sortie colorée.
$ 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
...
--`-- dernière (-l) ʻoption
Affichez la dernière version.
$ 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 ...
--` - obsolète (-o) ʻoption
Vue des anciens packages.
$ poetry show -o
django 2.2.4 3.0.2 A high-level Python Web framework that e...
lock
Verrouillez la dépendance spécifiée dans pyproject.toml
. (Ne pas installer)
poetry.lock
est généré.
$ poetry lock
env
Commandes liées à l'environnement virtuel. Vous pouvez spécifier 3.7.4 etc. dans la partie [python].
$ poetry env info #Informations sur l'environnement virtuel actuel
$ poetry env list #Liste des environnements virtuels
$ poetry env remove <python> #Supprimer l'environnement virtuel
$ poetry env use <python> #Activer ou créer un environnement virtuel
Dans mon environnement, lorsque virtualenvs.in-project = true
, il n'était pas affiché dans la liste et la suppression ne fonctionnait pas.
C'est une bonne idée de supprimer .venv /.
shell
Lancez le shell dans l'environnement virtuel. Équivalent à «pipenv shell».
$ poetry shell
scripts
Vous pouvez exécuter le script en entrant ce qui suit dans pyproject.toml
.
pyproject.toml
[tool.poetry.scripts]
start = "script:main"
script.py
def main():
print("Run script with poetry!")
$ poetry run start
Run script with poetry!
Même si vous n'entrez pas dans l'environnement virtuel, si vous l'exécutez à partir d'un script, il sera exécuté dans l'environnement virtuel.
En regardant le [code exécutable des scripts] de poésie (https://github.com/python-poetry/poetry/blob/master/poetry/console/commands/run.py), il semble qu'aucun argument ne peut être passé.
poetry/console/commands/run.py
#code d'exécution de script de poésie
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_) #Courir
]
return self.env.execute(*cmd)
Avec les paramètres de script ci-dessus, ʻimport_module ('script'). Main () est exécuté, donc il n'y a pas de partie pour passer des arguments en premier lieu. J'ai souvent enregistré
start =" python manage.py runserver 0.0.0.0:8000 "` dans Pipenv, donc j'étais en difficulté.
pyproject.toml
[tool.poetry.scripts]
start = "manage:main"
Ensuite, si vous définissez poetry run start runserver 0.0.0.0: 8000
, cela fonctionnera. .. ..
-Bon (comparé à pipenv) L'installation, l'ajout, la suppression et le verrouillage sont plus rapides (importants) que Pipenv, et l'affichage sur la console est facile à voir. Les fonctions équivalentes à «pip list» et «pipenv graph» sont également assez faciles à voir.
-Parfait (comparé à pipenv) Coopération avec venv. Il peut être utilisé avec la même convivialité que Pipenv. (Je m'inquiète du comportement pendant venv in project) Il ne semble pas y avoir de fonctionnalité permettant l'installation de pyenv à partir de pipenv, mais ce n'est pas grave car ce n'est pas quelque chose que j'utilise souvent.
-Mauvais (comparé à pipenv) Après toute la partie script. Il y a eu de nombreux problèmes, alors j'attends des améliorations. Je pense qu'il existe de nombreuses options. Rappelez-vous juste.
Compte tenu des points ci-dessus, il semble que nous utiliserons la poésie. En parlant de luxe, j'aurais dû savoir s'il s'agissait de dev au "spectacle de poésie".
Recommended Posts