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 virtualenvpipenv graph
: un graph de toutes vos dépendancespipenv --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à.
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 :-)
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
:)
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
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) puispipenv install tablib
. Si ensuite je « rentre » dans mon virtualenv avecpipenv shell
puis que je faispip 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 jetapepipenv graph
, donc j’aurais tendance à dire que oui ?@Alex : je pense que ton problème est expliqué dans la doc officielle :
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 ?
hop, comme d’hab, un peu de relecture:
J’ai fait quelques suggestions d’améliorations… et je me suis fait envoyer bouler
@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
@Laopi: Merci! Le pire, c’est que je l’avais lu. Trop vite. Sans tilter.
Setup.cfg et pipenv s’utilisent dans 2 cas differents. Le premier si on publie sur pipy, le second pour les projets composites internes.
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é.
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” ?
pour ceux qui ce pose la meme question
voir ici https://packaging.python.org/new-tutorials/installing-and-using-packages/#installing-pipenv
donc sous linux (ubuntu)
nano ~/.profile
ajouter export PATH=$PATH:~/.local/bin en bas
et ensuite :
source ~/.profile
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.
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).
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.
Compat ? Avec deb ?
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!
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).