Lors de l’apprentissage d’un langage de programmation, l’accent est essentiellement mis sur la compréhension de la syntaxe, du style de code et des concepts sous-jacents. Avec le temps, vous devenez suffisamment à l’aise avec le langage et vous commencez à écrire des programmes résolvant de nouveaux problèmes passionnants.

Cependant, lorsque vous devez vous diriger vers cette étape, il y a un aspect que l’on a peut-être sous-estimé, à savoir comment construire le bon environnement. Un environnement qui applique de bonnes pratiques d’ingénierie logicielle, améliore la productivité et facilite la collaboration. Chez Adaltas, nous gérons plusieurs projets open source et nous accueillons beaucoup de contributions. Ils ciblent principalement la plateforme Node.js. Sur la base de cette expérience, nous avons déjà établi pratiques courantes pour la gestion de projets à grande échelle écrits en Node.js.

Un autre langage que nous utilisons également beaucoup dans notre travail quotidien de consultant en données est Python. L’empaquetage et l’outillage avec Python sont souvent décrits comme fastidieux et difficiles. À cet égard, plusieurs projets open-source ont vu le jour ces dernières années et visent à faciliter la gestion des packages Python tout au long de vos projets de travail. Nous allons voir ici comment en utiliser deux : Pyenvpour gérer et installer différentes versions de Python, et Poésie, pour gérer vos packages et environnements virtuels. Combinés ou utilisés individuellement, ils vous aident à établir un environnement productif.

Cet article est le premier d’une série de trois dans lesquels nous partageons nos meilleures pratiques.

Conditions préalables

pyenv installation

À installer pyenv vous avez besoin de certaines dépendances spécifiques au système d’exploitation. Ceux-ci sont nécessaires comme pyenv installe Python en construisant à partir de la source. Pour Ubuntu/Debian assurez-vous d’avoir installé les packages suivants :

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Pour connaître les dépendances requises sur votre système d’exploitation allez lire ceci Documentation. Une fois les dépendances installées, vous pouvez maintenant installer pyenv. Pour cela, je recommande d’utiliser installateur pyenv qui automatise le processus.

curl https://pyenv.run | bash

À partir de là, vous pouvez installer sur votre système toutes les versions de Python que vous souhaitez. Vous pouvez utiliser la commande suivante pour toutes les versions et variantes de Python disponibles :

Dans notre cas, nous allons installer le CPython classique dans les versions 3.7.10 , 3.8.7 , 3.9.2:

pyenv install 3.7.10
Downloading Python-3.7.10.tar.xz...
-> https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz
Installing Python-3.7.10...
Installed Python-3.7.10 to /home/fbraza/.pyenv/versions/3.7.10

Une fois les versions installées, vous pouvez les voir en exécutant :

pyenv versions
* system
  3.7.10
  3.8.7
  3.9.2

Tu peux voir ça pyenv identifié les versions de Python récemment installées ainsi que celle installée par défaut sur votre système. La * avant de system signifie que la version globale utilisée maintenant est la version du système. pyenv permet de gérer les versions de Python à différents niveaux : globalement et localement. Disons que nous allons définir la version 3.7.10 comme notre version globale.

Listons à nouveau notre version :

pyenv versions
  system
* 3.7.10 (set by /home/<username>/.pyenv/version)
  3.8.7
  3.9.2

Tu peux voir ça pyenv ensembles 3.7.10 comme notre version globale de Python. Cela ne modifiera pas les opérations nécessitant l’utilisation de la version du système. Le chemin que vous pouvez lire entre parenthèses correspond au chemin qui pointe vers la version Python requise. Comment cela marche-t-il? Brièvement, pyenv capture les commandes Python à l’aide d’exécutables injectés dans votre PATH. Ensuite, il détermine la version de Python que vous devez utiliser et transmet les commandes à l’installation correcte de Python. N’hésitez pas à lire l’intégralité Documentation mieux appréhender les fonctionnalités et les possibilités offertes par pyenv.

Ne soyez pas confus par la sémantique ici. Changer la version globale n’affectera pas la version de votre système. La version du système correspond à la version utilisée par votre système d’exploitation pour accomplir des tâches spécifiques ou exécuter des processus d’arrière-plan qui dépendent de cette version spécifique de Python. Ne changez pas la version du système à une autre ou vous pourriez rencontrer plusieurs problèmes avec votre système d’exploitation ! Cette version est généralement mise à jour avec votre système d’exploitation. La version globale est juste la version qui pyenv utilisera pour exécuter vos commandes/programmes Python globalement.

poetry installation

Poetry vous permet de gérer efficacement les dépendances et les packages en Python. Il a un rôle similaire à setup.py ou pipenv, mais offre plus de flexibilité et de fonctionnalités. Vous pouvez déclarer les bibliothèques dont dépend votre projet dans un pyproject.toml dossier. poetry les installera ou les mettra à jour à la demande. De plus, cet outil vous permet d’encapsuler votre projet de travail dans des environnements isolés. Enfin, vous pouvez utiliser poetry pour publier directement votre package sur pypi.

Comme dernier pré-requis nous allons installer poetry en exécutant la commande suivante :

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Création de projet

Nous allons voir comment créer un projet et l’isoler dans un environnement Python en utilisant pyenv et poetry.

Définir la version de Python avec Pyenv

Commençons par créer un répertoire nommé my_awesome_project et déplacez-vous à l’intérieur :

mkdir my_awesome_project && cd $_

Une fois à l’intérieur, définissez la version locale de Python que nous allons utiliser (nous allons utiliser Python 3.8.7). Cela incitera poetry utiliser la version locale de Python définie par pyenv:

Cela crée un .python-version fichier à l’intérieur de notre projet. Ce fichier sera lu par pyenv et l’invite à définir la version Python locale définie. Par conséquent, chaque répertoire ou fichier créé à ce stade dépendra de la version locale de Python et non de la version globale.

Créez votre projet avec poetry

Poetry propose une CLI robuste vous permettant de créer, configurer et mettre à jour votre projet Python et ses dépendances. Pour créer votre projet Python, utilisez la commande suivante :

poetry new <project_name>

Cette commande génère un échafaudage de projet par défaut. Le contenu de notre nouveau projet est le suivant :

.
├── 
│   └── __init__.py
├── pyproject.toml
├── README.rst
└── tests
    ├── __init__.py
    └── test_summarize_dataframe.py

Remarquez le pyproject.toml. C’est là que nous définissons tout, depuis les métadonnées, les dépendances, les scripts, etc. de notre projet. Si vous connaissez Node.js, considérez le pyproject.toml comme équivalent du Node.js package.json.

[tool.poetry]
name = "your_project_name"
version = "0.1.0"
description = ""
authors = ["<username> <email address>"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Nous pouvons voir plusieurs entrées dans notre défautpyproject.toml dossier.

  • [tool.poetry]: Cette section contient des métadonnées sur notre package. Vous pouvez y mettre le nom du package, une courte description, les détails de l’auteur, la version de votre projet, etc. Tous les détails ici sont facultatifs mais seront nécessaires si vous avez décidé de publier le package sur pypi.
  • [tool.poetry.dependencies]: Cette section contient toutes les dépendances requises pour notre package. Vous pouvez spécifier des numéros de version spécifiques pour ces packages (packageX = "1.0.0") ou utilisez des symboles. La version de Python que nous voulons que le projet utilise est également définie ici. Dans notre cas python = "^3.8" précise le le minimum version requise pour exécuter notre application. Voici Python 3.8 et cela a été basé sur la version de notre version locale définie avec pyenv.
  • [tool.poetry.dev-dependencies]: Cette section contient toutes les dépendances de développeur qui sont des packages nécessaires pour travailler et itérer sur ce projet. Néanmoins, ces dépendances ne sont pas nécessaires pour exécuter l’application et ne seront pas téléchargées lors de la construction du package.
  • [build-system]: Ne touchez pas à cette section à moins d’avoir mis à jour la version de poetry.

vous pouvez voir la liste complète des entrées disponibles pour le pyproject.toml dossier ici

Installer et activer l’environnement virtuel

Ici, vous avez deux approches : si vous connaissez à l’avance toutes les dépendances dont vous avez besoin et si vous pouvez directement modifier le .toml fichier en conséquence ou vous décidez d’ajouter plus tard si nécessaire. Dans notre exemple, nous allons ajouter au fur et à mesure de l’écriture du code nos dépendances. Par conséquent, il suffit d’initialiser le projet et de créer l’environnement virtuel. Pour cela lancez la commande :

poetry install
Creating virtualenv summarize-dataframe-SO-g_7pj-py3.8 in ~/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (6.4s)

Writing lock file

Package operations: 8 installs, 0 updates, 0 removals

  • Installing pyparsing (2.4.7)
  • Installing attrs (20.3.0)
  • Installing more-itertools (8.7.0)
  • Installing packaging (20.9)
  • Installing pluggy (0.13.1)
  • Installing py (1.10.0)
  • Installing wcwidth (0.2.5)
  • Installing pytest (5.4.3)

Installing the current project: summarize_dataframe (0.1.0)

Premièrement, l’environnement virtuel est créé et stocké en dehors du projet. Un peu similaire à ce que nous avons lors de l’utilisation conda. En effet, au lieu de créer un dossier contenant vos bibliothèques de dépendances (comme virtualenv Est-ce que), poetry crée un environnement sur un chemin système global (.cache/ par défaut). Cette séparation des préoccupations permet d’éloigner votre projet du code source des dépendances.

Vous pouvez créer votre environnement virtuel dans votre projet ou dans n’importe quel autre répertoire. Pour cela, vous devez modifier la configuration de la poésie. Suivez ceci Documentation pour plus de détails.

Deuxièmement, poetry va lire le pyproject.toml et installez toutes les dépendances spécifiées dans ce fichier. S’il n’est pas défini, la poésie téléchargera la dernière version des packages. A la fin de l’opération, un poetry.lock fichier est créé. Il contient tous les packages et leurs versions exactes. Gardez à l’esprit que si un poetry.lock fichier est déjà présent, les numéros de version qui y sont définis prévalent sur ce qui est défini dans le pyproject.toml. Enfin, vous devez engager le poetry.lock fichier dans votre référentiel de projet afin que tous les collaborateurs travaillant sur le projet utilisent les mêmes versions des dépendances.

Activons maintenant l’environnement que nous venons de créer avec la commande suivante :

peotry shell
Spawning shell within ~/.cache/pypoetry/virtualenvs/summarize-dataframe-SO-g_7pj-py3.8
. ~/.cache/pypoetry/virtualenvs/summarize-dataframe-SO-g_7pj-py3.8/bin/activate

La commande crée un processus enfant qui hérite du Shell parent mais ne modifie pas son environnement. Il encapsule et limite toutes les modifications que vous apporterez à votre environnement de projet.

Créez notre git dépôt

Pour notre dernière étape ici, nous allons créer un référentiel git, ajouter README.md et .gitignore fichiers et poussez tout vers notre référentiel distant.

git init
git remote add origin https://github.com/fbraza/summarize_dataframe.git
echo ".*\n!.gitignore" > .gitignore
echo "# Summarize dataframe" > README.md
git add .
git commit -m "build: first commit. Environment built"
git push -u origin master

Conclusion

Ici, nous avons vu comment installer et gérer différentes versions de Python sur notre machine en utilisant pyenv. Nous avons montré comment tirer parti pyenv local pour définir une version Python spécifique dans votre projet, puis créer un environnement virtuel à l’aide poetry. L’utilisation de poetry facilite vraiment le processus de création en proposant un échafaudage simple et largement projeté. En outre, il inclut les exigences minimales du système de construction telles que définies par PEP 518.

Dans notre prochain article, nous allons plonger davantage dans notre projet. Nous allons écrire du code avec leurs tests unitaires respectifs et voir comment nous pouvons utiliser poetry pour ajouter les dépendances attendues et exécuter les tests. Enfin, nous allons aller un peu plus loin et installer toutes les dépendances nécessaires avec poetry pour nous aider à appliquer les bonnes pratiques avec nos git commits lors de l’utilisation d’un projet Python.

Aide-mémoire

pyenv

  • Obtenez toutes les versions disponibles et installables de Python
  • Définir la version globale de Python
     pyenv global <version_id>
  • Définir une version locale de Python

poetry

Leave a Reply