Oubliez `venv`, adoptez `pipenv`, un projet porté par PyPA

Ce sujet est ma tentative de faire connaître pipenv dont on parle peu, j’ai l’impression, alors même qu’on continue de parler de venv et de comment lui tordre le bras — parce que, oui, venv a des défauts notoires. Il serait grand temps que venv prenne la retraite pour laisser place à ce qui se fait de mieux, actuellement.

pipenv : petite intro

Extrait de la note d’intention (non traduite en français) publiée sur le site officiel du projet pipenv :

Pipenv: Python Dev Workflow for Humans

Pipenv is a Python virtualenv management tool that supports a multitude of systems and nicely bridges the gaps between pip, python (using system python, pyenv or asdf) and virtualenv. Linux, macOS, and Windows are all first-class citizens in pipenv.

Pipenv automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your Pipfile as you install/uninstall packages. It also generates a project Pipfile.lock, which is used to produce deterministic builds.

Pipenv is primarily meant to provide users and developers of applications with an easy method to arrive at a consistent working project environment.

The problems that Pipenv seeks to solve are multi-faceted:

  • You no longer need to use pip and virtualenv separately: they work together.

  • Managing a requirements.txt file with package hashes can be problematic. Pipenv uses Pipfile and Pipfile.lock to separate abstract dependency declarations from the last tested combination.

  • Hashes are documented in the lock file which are verified during install. Security considerations are put first.

  • Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.

  • Gives you insight into your dependency graph (e.g. $ pipenv graph).

  • Streamline development workflow by supporting local customizations with .env files.

Pour aller plus loin :

Un peu de pratique : installer pipenv dans le cadre d’un projet

Petites précisions pour la clarté :

  • Le texte ci-dessous est un extrait des notes perso, prises en suivant un tuto de Django.
  • Les notes sont en anglais (pas taper ! c’est pas de l’anglais littéraire non plus…)

1. Why pipenv? pipenv vs venv

pipenv has some advantages over venv, like:

Feature pipenv venv
Dependency management Uses a Pipfile to track and manage package dependencies Does not have built-in dependency management
Reproducibility Can create a Pipfile.lock file to recreate your virtual environment on another machine or at a later time Does not have a built-in mechanism for reproducibility
Simplicity Combines the functionality of venv and pip into a single tool Is a lower-level tool that only creates virtual environments

2. Set up pipenv virtual environment

2.1. Make sure pipenv is installed, otherwise install it

sudo apt update

sudo apt install pipenv

2.2. Open terminal in a so-called my-django-workspace directory and run pipenv install django

cd my-django-workspace

pipenv install django

This will create

  • ./Pipfile (a TOML config file)

  • ./Pipfile.lock (a JSON file)

and a few new directories in your user’s home directory:

~/.local/share/virtualenv/
├── py_info/
└── wheel/

~/.local/share/virtualenvs/
└── my-django-workspace-A3MO-irQ/

2.3. Run pipenv shell to launch the virtual environment

  • Make sure you are in a directory with the Pipfile and Pipfile.lock files.

  • Run pipenv shell

  • To quit the virtual environment, press ctrl d.

2.4. Other useful pipenv commands

  • pipenv run pip freeze

Pipenv a eu son heure de gloire il y a quelques années, puis s’est vu remplacer par des outils mieux foutus qui œuvraient sur le même créneau (poetry par exemple), il me semble aussi qu’il a connu des périodes où il n’était plus maintenu.

Mais Pipenv et venv n’ont pas du tout le même usage.
Pipenv c’est un outil tout-en-un qui entend gérer pour toi ton environnement virtuel, l’installation de tes dépendances et leurs versions, ainsi que le packaging de ton projet.
venv c’est simplement un gestionnaire d’environnement virtuel (donc un petit outil qui modifie les variables d’environnement de ton shell pour indiquer à Python un autre répertoire où se trouvent les paquets installés). Pour ce qui est de l’installation des paquets, ça n’a pas à voir avec venv puisque c’est géré par l’outil le plus standard qui soit en Python : pip.

Par contre qu’entends-tu par « porté par PyPA » ? Je croyais qu’il était juste reconnu par cette autorité (au même titre que de nombreux projets liés au packaging).

1 « J'aime »

J’ai l’impression que pipenv ne gère pas la partie packaging, d’un côté c’est bien car j’aime les outils qui ne font qu’une seule chose et qui le font bien, de l’autre côté j’ai déjà un outil qui fait une seule chose et qui le fait bien : venv (1k lignes de code pour le module venv contre 270k lignes de code pour pipenv, je suis effrayé).

Si j’ai bien compris pipenv est prisé pour sa gestion des dépendances, mais je refuse de croire qu’en mettant les devs dans la bulle de confort « toutes les dépendances sont épinglées vous n’aurez jamais la moindre surprise » soit bon : si c’est pas les devs qui tombent sur les problèmes de dépendances ce sera au mieux la personne chargée du packaging, au pire les utilisateurs (et donc ça retombera sur les devs via des issues).

3 « J'aime »

Je profite du advent of code cette année pour tester GitHub - mitsuhiko/rye: An Experimental Package Management Solution for Python avec gestion assez complete de workflow création, dev, publication, … et qui s’inspire de l’outil rust cargo

J’aime bien pour l’instant…

Personnellement j’utilise un mix de venv et pyenv pour mon travail quotidien, et ça me convient très bien.