pipenv, solution moderne pour remplacer pip et virtualenv


Kenneth Reitz, l’auteur de requests, tente régulièrement de nous refaire le coup du projet star. Ca n’a malheureusement pas très bien marché, et beaucoup de ses projets comme maya, records, crayon, tablib ou awesome n’ont pas vraiment connu de succès.

Entre alors pipenv, que j’ai testé il y a presque un an, et qui au départ montrait un beau potentiel, mais n’était pas encore très utilisable. J’ai fait quelques suggestions d’amélioration, comme permettre de choisir précisément la version de Python, et je me suis fait envoyé bouler. J’ai donc laissé l’auteur s’enterrer dans sa recherche de gloire passée.

Le hasard de reddit m’a remis pipenv sous le nez, et j’ai donc redonné sa chance au produit. Surprise, l’outil est maintenant très stable (plus de 2000 commits !) et mes propositions avaient même été intégrées.

Après ces 3 paragraphes vous vous demandez sans doute quand est-ce que je vais rentrer dans le vif du sujet, donc:

pipenv reprend les idées de pip, virtualenv, pew et même quelques trucs de npm, yarn, cargo, et essaye d’appliquer tout ça à Python. L’article suppose que vous savez ce que sont ces mots barbares, donc suivez les liens si ce n’est pas le cas.

pipenv permet donc d’installer des packages Python, d’isoler cette installation et de la rendre reproductible. Mais sans effort.

En effet, contrairement à la concurrence:

  • La gestion du virtualenv est automatique et transparente
  • Les paquets installés sont sauvegardés dans des fichiers de config, encore une fois de manière automatique et transparente.
  • Les fichiers de config distinguent les dépendances de prod et de dev, et incluent les versions des sous-dépendances.

Installer pipenv

Contrairement à pip et virtualenv, pipenv n’est pas fourni avec une installation standard de Python, bien que l’outil soit maintenant recommandé par la doc officielle. Il va donc falloir l’installer. Or pipenv se base sur une version récente de pip, donc il faut d’abord être sûr d’avoir pip à jour.

Du coup:

# mise à jour de pip, mais juste au niveau utilisateur pour 
# pas casser le  system
python -m pip install pip --upgrade --user

Puis:

# installation de pipenv
python -m pip install pipenv --user

A moins d’être sous une Debian like type Ubuntu (qui demande un apt install de python-pip avant), tout le monde a pip installé avec une version moderne de Python.

Voilà, vous devriez avoir la commande pipenv disponible, ou pour ceux qui ont un système mal configuré, python -m pipenv.

Usage

Dans le dossier de votre projet:

pipenv install nom_du_package

C’est tout.

Si un virtualenv n’existe pas il sera créé. Sinon il sera utilisé. Les fichiers de configs sont gérés automatiquement, il n’y a rien à faire.

Si vous voulez lancer une commande dans le virtualenv:

pipenv run commande

Exemple:

pipenv run python

Va lancer le Python de votre virtualenv.

Si vous voulez que toutes les commandes soient dans le virtualenv:

pipenv shell

Et vous êtes dans un nouveau shell, dans le virtualenv. Ainsi:

python

Lancera celui de votre virtualenv.

On sort du shell avec Ctrl + D.

Vous pouvez arrêtez de lire l’article ici, c’est l’essentiel de ce qu’il y a à savoir.

Astuces

Si vous lancez pour la première fois dans un dossier pipenv avec:

pipenv --python x.x

Le virtualenv sera créé avec la version de Python x.x, pourvu qu’elle existe sur votre système. Setter la variable d’env PIPENV_DEFAULT_PYTHON_VERSION a le même effet.

Installer un package avec pipenv install --dev le marque comme dépendance de développement uniquement, et permet une installation séparée.

Vous pouvez aussi obtenir quelques infos utiles comme:

  • pipenv --venv: ou est le dossier du virtualenv
  • pipenv graph: un graph de toutes vos dépendances
  • pipenv --py: chemin vers le Python en cours.

Enfin pipenv utilise pew, donc la magie de pew reste dispo, y compris la gestion de projets :)

Usage avancé

Si vous créez un fichier .env dans le dossier de votre projet tels que:

FOO=1
BAR=wololo

pipenv exécutera toutes ses commandes (y compris shell), avec FOO et BAR comme variables d’environnement.

La commande:

pipenv lock

Va créer un lock file. Ce fichier contient toutes les dépendances, et recursivement, les dépendances des dépendances, installées, avec leurs versions. On peut réutiliser ce fichier en prod pour installer une exacte copie de son setup local avec pipenv install. Sans ce fichier, pipenv install se comportera comme pip install.

Il y a plein d’autres trucs mais on va en rester là.

19 thoughts on “pipenv, solution moderne pour remplacer pip et virtualenv

  • Ludovic Gasc

    Yo,

    Si j’ai bien suivi les inspirations de Kenneth, il y avait aussi pip-tools, que nous utilisons beaucoup sur nos gros projets pour mettre à jour les dépendances de manière intelligente.

    À priori, pipenv à l’air de faire ça aussi, mais j’attends le retour des early-adopters de pipenv avant de tout jeter ;-)

    Bref, s’il y a des lecteurs de Sam & Max qui utilisaient pip-tools et qui ont déjà migré vers pipenv, leur retour d’expériences m’intéresse.

    Merci à vous :-)

  • flotux

    Merci pour le billet.

    que j’ai testé il y a presque qu’un an –> que j’ai testé il y a presque un an

  • Alex

    Hello,

    “ou pour ceux qui ont un système mal configuré, python -m pipenv.”

    Pourrais tu stp en dire un peu plus sur ce qui est mal configuré et la manière de le corriger? Les seules réponses que je trouve consistent à faire une install globale, mais c’est pas le but.

    Merci

  • Laopi

    Merci de nous faire découvrir ça !

    J’avais pas bien compris, mais quand on fait pipenv install package, pipenv regarde ce qui se trouve dans le dossier courant et soit crée un virtualenv qui a ce package d’installé, soit l’ajoute au virtualenv existant.

    Du coup, disons que j’installe requests et tablib avec les commandes pipenv install requests (qui va me créer un virtualenv puisque mon dossier en cours est vide) puis pipenv install tablib. Si ensuite je « rentre » dans mon virtualenv avec pipenv shell puis que je fais pip install pygal, est-ce que ce package va être tracké par pipenv ? J’ai fait un test et je vois bien pygal quand je sors de mon virtualenv et que jetape pipenv graph, donc j’aurais tendance à dire que oui ?

    @Alex : je pense que ton problème est expliqué dans la doc officielle :

    Note

    This does a user installation to prevent breaking any system-wide packages. If pipenv isn’t available in your shell after installation, you’ll need to add the user base’s binary directory to your PATH.

    On Linux and macOS you can find the user base binary directory by running python -m site –user-base and adding bin to the end. For example, this will typically print ~/.local (with ~ expanded to the absolute path to your home directory) so you’ll need to add ~/.local/bin to your PATH. You can set your PATH permanently by modifying ~/.profile.

  • Romain

    J’ai testé hier du coup. Avoir virtualenv, le Pipfile qui se met à jour lorsque les dépendances sont installées et la séparation entre les dépendances de dev et de prod est super cool.

    Je vais peut-être dire une connerie, mais ce qui manque je pense c’est la génération d’un setup.py, parce que c’est un peu relou d’avoir à le copier d’un autre projet, ou d’utiliser cookiecutter en plus.

    En écrivant ça, je viens de voir qu’il y a pipenv tool : https://pypi.python.org/pypi/pipenv-tools/0.0.1

    Mais ça fait toujours un truc en plus. Peut-être que ce sera intégré par la suite ?

  • Ashgan

    hop, comme d’hab, un peu de relecture:

    J’ai fait quelques suggestions d’améliorations… et je me suis fait envoyer bouler

  • foxmask

    @romain j’avais demande à pouvoir générér un requierements en déchargeant le pipfile dedans, qui est ensuite chargé dans setup.py réponse négative.

    Et depuis peu j’ai croisé une très bonne présentation de setup.py et setup.cfg du coup pipenv ne m’intéresse plus , sauf pipenv graph

    La présentation

    https://twidi.github.io/python-packaging-talk/fr

  • Alex

    @Laopi: Merci! Le pire, c’est que je l’avais lu. Trop vite. Sans tilter.

  • Sam Post author

    Setup.cfg et pipenv s’utilisent dans 2 cas differents. Le premier si on publie sur pipy, le second pour les projets composites internes.

  • Étienne BERSAC

    Salut,

    Pareil que toi, je préfère laisser Kenneth le narcissique hyper actif se calmer plutôt que de contribuer. Ça me choque de voie ses leçons de morale… Be positive, etc. C’est du bullshit. Tout le monde n’est pas Linus. Et même Linus a plus de considération pour ses utilisateurs.

    Même topo quand on voit le mépris de Kenneth pour pip alors s’ils font un boulot de chien qui n’est pas pour rien dans le succès de Python. https://github.com/kennethreitz/pipenv/issues/740

    Détail important, pipenv embarque un fork de pip et bien d’autres dépendances dans des dossiers ‘patched’ et ‘vendor’. Donc pipenv a des bugs déjà corrigés en amont, ça ne sert à rien de mettre à jour pip… Cf https://github.com/kennethreitz/pipenv/issues/739 et la PR qui a résolu le bug en back portant un commit amont de pip…

    J’attends que le dépôts sorte du profil kenneth et soit repris par la communauté.

  • keiser1080

    je fait parti de ceux qui sans le savoir ont (un système mal configuré)

    pipenv me renvois

    pipenv : commande introuvable

    Pouvez vous me dire comment configurer mon system pour pouvoir l’exécuter sans ajouter “python -m pipenv” ?

  • BuffaloWings

    C’est pas trop tôt que Python aie enfin un package manager tout juste correct sous la forme de pipenv. Récemment même un écosystème aussi à l’arrache que JavaScript a eu Yarn (NPM 5 a pointé le bout de son nez aussi, mais pas encore super stable niveau gestion de dépendances).

    Le mot “immature” ne me vient pas à l’esprit quand on me parle de Python, mais force est de constater que c’est le cas en ce qui concerne les package managers.

    Et pendant ce temps, Ruby a eu Bundler avec à peu près les mêmes fonctionnalités depuis 2009.

  • Gaetan

    Je trouve que la combinaison pbr + pipenv est du tonnerre. Voila ce que ca donne sur un tout petit service web : https://github.com/Stibbons/dopplerr

    On a PBR qui s’occupe du versionning + ChangeLog + AUTHORS, pipenv de l’environnement, des checks avec pylint et consor, le tout organisé autour d’un makefile, et qu’on package a la fois dans un package pypi et un docker (voir la remarque sur les README.rst et .md dans le README de ce projet)

    On utilise pipenv en prod desormais, c’est tres efficace.

    Je fais la distinction entre gestion des dependances d’une lib python (par “range” et sans tracker le lock file) et d’une application (en freezen toutes les dependances avec le “lock” file).

  • Étienne BERSAC

    On a des infos sur la compat avec les distributions RHEL et debian ? Je pense que pour le moment, ça va être réservé aux projets conteneurisés.

  • Anne Onmye

    Merci pour cet article, ça a l’air génial mais il y a un truc qui me chiffonne: comment peut-on, avec Windows (je sais, je sais…), afficher dans le prompt le virtualenv activé lorsqu’on lance un pipenv shell? Je trouve ça gênant de ne pas pouvoir le voir (par opposition à un virtualenv “classique”). Une idée de comment faire? Merci!

  • Rémi

    Sinon il existe poetry https://github.com/sdispater/poetry. AFAIK il fait pas le buzz, mais je pense qu’il merite qu’on en parle.
    Si qqun a des retours, ca m’intéresse, je l’envisage pour le prochain projet.

    D’apres le README, par rapport a pipenv, une autre philosophie, une meilleure resolution des deps que pipenv, une meilleure utilisation des standards (utilise pyproject.toml au lieu de rajouter encore d’autres fichiers de config pour gerer les dependances).

    J’ai aucun lien avec le projet. (Desole pour les accents, QWERTY).

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.