Environnements virtuels Python

Vue d'ensemble

Nous sommes nombreux à travailler sur plusieurs projets Python en même temps. Plusieurs projets peuvent dépendre de différentes versions de la même bibliothèque. C'est un problème. Même si vous travaillez avec un seul projet et que vous le déployez en production, vous pouvez rencontrer des problèmes car le système Python sur votre serveur de production peut changer en raison de la mise à niveau du système d'exploitation ou d'un correctif de sécurité, ce qui peut entraîner l'échec de votre application. En général, vous voulez un contrôle total sur l'environnement Python de vos projets. Entrez dans les environnements virtuels…

L'idée de base d'un environnement virtuel est de disposer d'un interpréteur Python et de ses packages de site distincts de ceux du système. En outre, vous pouvez en avoir beaucoup. Cela résout les deux problèmes. Vous pouvez affecter un environnement virtuel distinct avec ses propres dépendances pour chaque projet et oublier les conflits avec d'autres projets et le système Python..

Dans ce didacticiel, vous allez apprendre les concepts des environnements virtuels, comment les créer et les utiliser, et découvrir différentes alternatives pour des situations spéciales..

Virtualenv

Le paquet virtualenv supporte ce concept. Vous pouvez installer virtualenv en utilisant pip installer virtualenv.

Une fois que virtualenv est installé, vous pouvez commencer à créer des environnements virtuels. Créons deux environnements appelés "venv_1" et "venv_2".

~> virtualenv ~ / venv_1 Utilisation du préfixe réel '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Un nouvel exécutable python dans /Users/gigi/venv_1/bin/python2.7 également création d'un exécutable dans / Users / gigi / venv_1 / bin / python Installation de setuptools, pip, wheel… done. ~> virtualenv ~ / venv_2 Utilisation du préfixe réel '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Nouvel exécutable python dans /Users/gigi/venv_2/bin/python2.7. création d'un exécutable dans / Users / gigi / venv_2 / bin / python Installation de setuptools, pip, wheel… done.

Voyons ce qui se passe.

~> ls -la ~ / venv_1 total 16 drwxr-xr-x personnel de 7 gigi 238 mars 29 23:12. drwxr-xr-x + 254 gigi de personnel 8636 29 mars 23h12… lrwxr-xr-x 1 gigi de personnel 79 mars 29 23h12 .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python. framework / Versions / 2.7 / Python drwxr-xr-x personnel de 16 Go 544 29 mars 23:12 bin drwxr-xr-x personnel de 3 Gigi 102 mars 29 23:12 inclus drwxr-xr-x personnel de 3 gigi 102 102 mars 29 23: 12 lib -rw-r - r-- 1 gigi de personnel 60 mars 29 23:12 pip-selfcheck.json

Dans le sous-répertoire "bin", vous trouverez quelques exécutables et liens symboliques. Ceux-ci incluent l'interpréteur Python lui-même, pip, easy_install et, plus important encore, quelques scripts d'activation.

~> ls -la ~ / venv_1 / bin total 136 personnes drwxr-xr-x 16 gigi 544 54 mars 29 23h12. drwxr-xr-x 7 employés de gigi 238 mars 29 23: 12… -rw-r - r-- employés de 1 gigi 2077 mars 29 23:12 activer -rw-r - r-- employés de 1 gigi 1019 mars 29 23 : 12 activate.csh -rw-r - r-- 1 gigi de personnel 2217 mars 29 23:12 activer.fish-rw-r - r-- de 1 gigi personnel 1137 mars 29 23:12 activate_this.py -rwxr- xr-x 1 gigi personnel 249 mars 29 23:12 easy_install -rwxr-xr-x 1 gigi personnel 249 mars 29 23:12 easy_install-2.7 -rwxr-xr-x 1 gigi personnel 221 mars 29 23:12 pip -rwxr- xr-x 1 gigi staff 221 mars 29 23:12 pip2 -rwxr-xr-x 1 gigi staff 221 mars 29 23:12 pip2.7 lrwxr-xr-x 1 gigi staff 9 mars 29 23:12 python -> python2. 7 -rwxr-xr-x personnel de 1 gigi 2336 29 mars 23:12 python-config lrwxr-xr-x personnel de 1 gigi 9 mars 29 23:12 python2 -> python2.7 -rwxr-xr-x personnel de 1 gigi 12744 mars 29 23:12 python2.7 -rwxr-xr-x 1 gigi de personnel 228 mars 29 23:12 roue

Le script d'activation est la clé. Afin d'activer un environnement virtuel spécifique, vous sourcez le script d'activation, comme dans: source ~ / venv_1 / bin_activate. L'effet est de définir un groupe de variables d'environnement et de modifier l'invite en indiquant le nom de l'environnement virtuel activé. Il ajoute également un désactiver() fonction shell qui va tout réinitialiser. Une fois qu'un environnement virtuel est activé, tapez python va lancer son Python avec ses dépendances.

~> source ~ / venv_1 / bin / activate (venv_1) ~> quel python / Utilisateurs / gigi / venv_1 / bin / python (venv_1) ~>

Désactivons:

(venv_1) ~> désactiver ~> quel python / usr / local / bin / python

Si plusieurs interpréteurs Python sont installés sur vos systèmes, vous pouvez spécifier lequel utiliser pour votre environnement virtuel à l'aide de la commande -p option. Voici un environnement virtuel Python 3:

~> virtualenv ~ / venv_3 -p / usr / local / bin / python3 Exécution de virtualenv avec un interpréteur / usr / local / bin / python3 Utilisation du préfixe de base '/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework /Versions/3.5 'Nouvel exécutable python dans /Users/gigi/venv_3/bin/python3.5 Création également de l’exécutable dans / Users / gigi / venv_3 / bin / python Installation de setuptools, pip… done. ~> source ~ / venv_3 / bin / activate (venv_3) ~> python Python 3.5.1 (par défaut, le 9 janv. 2016, 19:28:52) [Compatible avec la norme Apple LLVM 7.0.0 (clang-700.1.76) )] sur darwin Type "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations. >>>

Virtualenv fonctionne même sur pypy.

~> virtualenv ~ / venv_pypy -p 'qui pypy' Exécution de virtualenv avec un interpréteur / usr / local / bin / pypy Nouvel exécutable pypy dans / Users / gigi / venv_pypy / bin / pypy Installation de setuptools, pip… done. ~> source ~ / venv_pypy / bin / activate (venv_pypy) ~> python Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, 11 févr. 2016, 20:39:39) [PyPy 4.0.1 avec GCC 4.2.1 Compatible Apple LLVM 7.0.2 ( clang-700.1.81)] sur darwin Type "aide", "droit d'auteur", "crédits" ou "licence" pour plus d'informations. >>>>

Vous pouvez passer directement d’un environnement à l’autre sans désactiver au préalable:

(venv_3) ~> source ~ / venv_2 / bin / activate (venv_2) ~> quel python / Utilisateurs / gigi / venv_2 / bin / python

D'ACCORD. Voyons comment utiliser deux versions différentes du même package dans deux environnements virtuels différents. C’est aussi simple que d’activer chaque environnement et d’installer la version souhaitée. Les environnements étant totalement indépendants, le fait qu’il existe une version différente dans un autre environnement n’est pas un problème..

Installons le paquet sh version 1.0.0 sur "venv_1".

(venv_1) ~> pip install sh == 1.0 Collecte sh == 1.0.0 Téléchargement de sh-1.0.tar.gz Création de roulettes pour les paquets collectés: sh Exécution de setup.py bdist_wheel pour sh… done Stocké dans le répertoire: / Users / gigi / Bibliothèque / Caches / pépin / roues / f9 / fb / a1 / 383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3 Construit avec succès sh Installation de packages collectés: sh Installé avec succès sh-1.0 (venv_1) ~> gel des pip | grep sh sh == 1,0

Passons à "venv_2" et installons la version 1.11.

(venv_1) ~> source ~ / venv_2 / bin / activer (venv_2) ~> pip installer sh == 1.11 Collecte sh == 1.11 Téléchargement de sh-1.11.tar.gz Création de roues pour les paquets collectés: sh Exécution de setup.py bdist_wheel pour sh… done Stocké dans le répertoire: / Utilisateurs / gigi / Bibliothèque / Caches / pip / roues / ba / 4f / a5 / ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c sh construit avec succès Installation de packages collectés: sh installé avec succès sh-1.11 (venv_2) ~> grep sh sh == 1.11

Maintenant, revenons à "venv_1" et vérifions que sa version du paquet sh est toujours 1.0.

(venv_2) ~> source ~ / venv_1 / bin / activate (venv_1) ~> arrêt gel | grep sh sh == 1.0 (venv_1) ~>

Virtualenvwrapper

Tous ces activations, désactivations et commutations peuvent devenir vieux au bout d'un moment. Si vous gérez de nombreux environnements virtuels, cela peut devenir incontrôlable. C'est là que virtualenvwrapper entre en jeu. Virtualenvwrapper vous permet de répertorier, créer, supprimer et copier des environnements virtuels. Il vous permet également de changer facilement d’environnement. 

Voici toutes les commandes:

~> virtualenvwrapper virtualenvwrapper est un ensemble d'extensions de l'outil virtualenv de Ian Bicking. Les extensions incluent des wrappers permettant de créer et de supprimer des environnements virtuels et de gérer autrement votre flux de travail de développement, facilitant ainsi le travail sur plusieurs projets à la fois sans introduire de conflits dans leurs dépendances. Pour plus d'informations, reportez-vous à la documentation: http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html Commandes disponibles: add2virtualenv: ajout du répertoire au chemin d'importation allvirtualenv: exécutez une commande dans tous les virtualenvs cdproject: changez le répertoire en le projet actif cdsitepackages: changez le répertoire site-packages cdvirtualenv: changez le répertoire $ VIRTUAL_ENV cpvirtualenv: dupliquez le virtualenv nommé pour en créer un nouveau lssitepackages: liste le contenu du répertoire site-packages lsvirtualenv: liste virtualenvs: liste virtualenvs: crée un nouveau répertoire de projet et son virtualenv associé mktmpenv: créer un virtualenv temporaire mkvirtualenv: créer un nouveau virtualenv dans $ WORKON_HOME rmvirtualenv: supprimer un virtualenv setvirtualenvproject: associer un répertoire de projet à un événement virtualenv: afficher les détails d'un seul dossier de sauvegarde -packages on / off virtualenvwrapper: affiche ce message d'aide wipeenv: remove tous les packages installés dans le virtualonv workon actuel: listez ou modifiez les virtualenvs actifs

J'utilise à peu près deux commandes: mkvirtualenv et travailler sur. Tous les environnements virtuels sont créés sous ~ / .environnementsvirtuels.

Voici comment créer un nouvel environnement virtuel:

~> mkvirtualenv venv Nouvel exécutable python dans venv / bin / python2.7 Création également de l'exécutable dans venv / bin / python Installation de setuptools, pip… done. (venv) ~>

Ceci est similaire à virtualenv, mais vous ne spécifiez pas de répertoire, mais simplement un nom. Votre nouvel environnement est ici:

(venv) ~> arbre -L 2 ~ / .virtualenvs / venv / /Users/gigi/.virtualenvs/venv/ ├── bin │ ├── activer │ activer.csh activer.pêcher Activez-les! Easy_install-easy_install-2.7 - get_env_details - pip-pip2-pip2.7 -actimate_details ├── préactivez préactivez python -> python2.7 python2 -> python2.7 │ │ python2.7 include │ │ python2.7 -> /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/include/python2.7 lib python2.7

Pour basculer entre les environnements, vous utilisez le travailler sur commande, qui sans arguments ne répertorie que tous les environnements virtuels. J'en ai plusieurs:

(venv) ~> workon acme_server conman curr-gen nupic surpassant pandas prime_hunter pypy service de citation vvv (venv) ~> workon conman (conman) ~>

Virtualenv-Burrito

Virtualenv-Burrito est un projet d'installation de virtualenv et de virtualenvwrapper en une seule commande..

Python 3 Venv

Le module venv a été ajouté à Python 3.3 et fournit la création et la gestion d’environnements virtuels intégrés, à l’instar de virtualenv. La commande pour créer des environnements virtuels est Pyenv. Sinon, c'est assez similaire à virtualenv.

Conda

Les environnements virtuels sont très utiles pour isoler les dépendances entre différents projets. Mais cela ne s'étend pas aux bibliothèques natives. De nombreuses extensions C dépendent de versions particulières de bibliothèques natives, qui ne peuvent pas être spécifiques à un environnement virtuel.. 

Conda peut résoudre ce problème. C'est un système de gestion de paquets qui gère toutes les dépendances, pas seulement les dépendances Python. Il peut même être utilisé pour le packaging de logiciels non-Python.

Alternatives aux environnements virtuels

Devez-vous utiliser des environnements virtuels? Pas vraiment. Si pour une raison quelconque vous n’aimez pas la magie des environnements virtuels, il existe d’autres options.

Vendez manuellement

La fonctionnalité d'un environnement virtuel est assez simple. Si vous avez besoin d'un contrôle total, vous pouvez le faire vous-même et copier exactement le sous-ensemble d'outils et de packages dans une structure de répertoires cible, configurer certaines variables d'environnement et le tour est joué..

Système virtuel ou système dockerized Python

Si vous intégrez vos applications dans un conteneur Docker ou dans une image cloud, un seul projet sera créé et vous n’aurez peut-être pas besoin d’un environnement virtuel au milieu. Vous pouvez simplement construire sur le système Python, en étant sûr qu'il ne sera pas modifié.

Tox

Si vous ne vous souciez que de tester votre code sous différents interpréteurs et environnements, Tox peut faire le gros du travail pour vous. Il utilisera toujours les environnements virtuels sous les couvertures, mais vous n'avez pas à les gérer.

Les meilleures pratiques

Certaines pratiques recommandées en matière de packaging et d'environnement virtuel ont émergé au fil du temps pour des systèmes Python robustes..

Verser les versions dans vos fichiers de besoins

Épingler signifie spécifier précisément les versions de vos dépendances. Si une nouvelle version sort et que vous installez votre application sur un nouveau serveur, vous utiliserez toujours la version que vous avez testée et qui fonctionne, et non la plus récente et la plus performante. Il y a un inconvénient ici - vous devrez explicitement mettre à niveau les versions si vous voulez suivre l'évolution de vos dépendances - mais cela en vaut généralement la peine.

Ne jamais utiliser le Python système

Faire confiance à la version du système est une mauvaise pratique, car il existe d'autres outils qui en dépendent, et si vous démarrez la mise à niveau des packages du système, vous risquez de les endommager. Vous pouvez également être affecté par les mises à jour de sécurité qui modifient les packages système. En général, si vous souhaitez mettre à niveau votre système d'exploitation, vous pouvez constater que le système Python est désormais différent..

Utiliser un index de paquets privés lors de la cuisson d'images

PyPI peut être en panne. Si vous avez besoin de créer une nouvelle image et que vous ne pouvez pas accéder à PyPI, vous avez des problèmes. Devpi est une bonne option pour éviter la frustration.

Conclusion

Il existe de nombreuses options pour gérer plusieurs projets Python sur le même ordinateur sans conflit. Déterminez quelle option vous convient le mieux et utilisez-la. Il est rapide et facile de créer des environnements virtuels. N'hésitez pas à profiter de cet outil utile. Si vous avez des exigences particulières, il existe également de nombreuses solutions.