[Python] Poésie que j'ai commencé & Impression que j'ai passé de Pipenv à la poésie

Motivation

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.

À propos de la poésie

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.

environnement

Python utilise celui installé par pyenv.

introduction

$ 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

Paramètres de poésie

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ébut du projet

Génération de modèle

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

Générer 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.

Traitement des arguments

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. .. ..

Impressions

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

référence

Recommended Posts

[Python] Poésie que j'ai commencé & Impression que j'ai passé de Pipenv à la poésie
[Python3] Liste des sites auxquels j'ai fait référence lorsque j'ai lancé Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Pourquoi je suis passé de Java à Dart
Je veux utiliser jar de python
J'ai commencé Python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux utiliser le solveur ceres de python
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
Histoire de passer de Pipenv à la poésie
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
J'ai commencé à analyser
Python que je voudrais recommander aux débutants en programmation
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de démarrer avec le script python de blender_Partie 02
Je voulais utiliser la bibliothèque Python de MATLAB
Construction de l'environnement de développement Python 2020 [De l'installation de Python à l'introduction à la poésie]
J'ai senti que j'avais porté le code Python en C ++ 98.
Publier de Python vers Slack
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
Flirter de PHP à Python
python Extraction de condition de la liste que j'oublie souvent
Je veux démarrer beaucoup de processus à partir de python
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Migrer de requirements.txt vers pipenv
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
Passer de python2.7 à python3.6 (centos7)
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
Connectez-vous à sqlite depuis python
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai fait quelque chose avec python qui NOW LOADING se déplace de gauche à droite sur le terminal
J'ai créé un générateur brouillé qui encode vos phrases préférées de UTF-8 à Shift-JIS (cp932) en Python
Premiers pas avec Poetry De l'installation à l'exécution et à la gestion des versions
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
8 services que même les débutants peuvent apprendre Python (des débutants aux utilisateurs avancés)
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 1
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 2
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
Appelez Matlab depuis Python pour optimiser
Lien pour commencer avec python
J'ai essayé de toucher Python (installation)
Publication de Python sur la chronologie Facebook
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Comment démarrer avec Python
Connectez-vous à la base de données utf8mb4 à partir de python
Python (de la première fois à l'exécution)
Publier une image de Python sur Tumblr
Comment accéder à wikipedia depuis python
Python pour passer d'une autre langue
Je veux déboguer avec Python
N'a pas changé de Python 2 à 3
Mettre à jour Mac Python de 2 à 3