Python virtuele omgevingen

Overzicht

Velen van ons werken tegelijkertijd aan meerdere Python-projecten. Meerdere projecten kunnen afhankelijk zijn van verschillende versies van dezelfde bibliotheek. Dit is een probleem. Zelfs als u met een enkel project werkt en u het in productie implementeert, kunt u in de problemen komen, omdat de Python van het systeem op uw productieserver kan veranderen als gevolg van een OS-upgrade of beveiligingspatch en uw toepassing mogelijk niet werkt. Over het algemeen wilt u de volledige controle over de Python-omgeving van uw projecten. Betreed virtuele omgevingen ...

Het basisidee van een virtuele omgeving is om een ​​Python-interpreter en zijn sitepakketten gescheiden te hebben van de systeem-pakket. Je kunt er ook veel van hebben. Dat lost beide problemen op. U kunt voor elk project een afzonderlijke virtuele omgeving met eigen afhankelijkheden toewijzen en conflicten met andere projecten en de Python van het systeem vergeten.

In deze tutorial leer je de concepten achter virtuele omgevingen en hoe je ze kunt maken en gebruiken, en ontdek je verschillende alternatieven voor speciale situaties.

virtualenv

Het virtualenv-pakket ondersteunt dit concept. U kunt virtualenv installeren met pip install virtualenv.

Nadat virtualenv is geïnstalleerd, kunt u beginnen met het maken van virtuele omgevingen. Laten we twee omgevingen creëren met de naam "venv_1" en "venv_2".

~> virtualenv ~ / venv_1 Gebruik het echte voorvoegsel '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Nieuw python-bestand in /Users/gigi/venv_1/bin/python2.7 uitvoerbaar maken in / Users / gigi / venv_1 / bin / python Installeren van setuptools, pip, wheel ... done. ~> virtualenv ~ / venv_2 Gebruik het echte voorvoegsel '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' Nieuw python-bestand in /Users/gigi/venv_2/bin/python2.7 Ook uitvoerbaar maken in / Gebruikers / gigi / venv_2 / bin / python Installeren van setuptools, pip, wheel ... klaar.

Laten we eens kijken wat er gebeurd is.

~> ls -la ~ / venv_1 totaal 16 drwxr-xr-x 7 gigi-personeel 238 29 maart 23:12. drwxr-xr-x + 254 gigi-personeel 8636 29 maart 23: 12 ... lrwxr-xr-x 1 gigi-personeel 79 Mar 29 23:12 .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python. framework / Versies / 2.7 / Python drwxr-xr-x 16 gigi personeel 544 mrt 29 23:12 bin drwxr-xr-x 3 gigi personeel 102 Mar 29 23:12 inclusief drwxr-xr-x 3 gigi personeel 102 Mar 29 23: 12 lib -rw-r - r-- 1 gigi-personeel 60 Mar 29 23:12 pip-selfcheck.json

In de "bin" submap vindt u een aantal uitvoerbare bestanden en symlinks. Deze omvatten de Python-interpreter zelf, pip, easy_install en vooral enkele scripts activeren.

~> ls -la ~ / venv_1 / bin totaal 136 drwxr-xr-x 16 gigi-personeel 544 29 maart 23:12. drwxr-xr-x 7 gigi-personeel 238 Mar 29 23: 12 ... -rw-r - r-- 1 gigi-personeel 2077 Mar 29 23:12 activate -rw-r - r-- 1 gigi-personeel 1019 29 maart 23 : 12 activate.csh -rw-r - r-- 1 gigi-personeel 2217 29 maart 23:12 activate.fish -rw-r - r-- 1 gigi-personeel 1137 29 maart 23:12 activate_this.py -rwxr- xr-x 1 gigi-personeel 249 29 maart 23:12 easy_install -rwxr-xr-x 1 gigi-personeel 249 29 maart 23:12 easy_install-2.7 -rwxr-xr-x 1 gigi-personeel 221 Mar 29 23:12 pip -rwxr- xr-x 1 gigi-personeel 221 Mar 29 23:12 pip2 -rwxr-xr-x 1 gigi-personeel 221 Mar 29 23:12 pip2.7 lrwxr-xr-x 1 gigi-personeel 9 Mar 29 23:12 python -> python2. 7 -rwxr-xr-x 1 gigi-personeel 2336 29 maart 23:12 python-config lrwxr-xr-x 1 gigi-personeel 9 Mar 29 23:12 python2 -> python2.7 -rwxr-xr-x 1 gigi-personeel 12744 mrt 29 23:12 python2.7 -rwxr-xr-x 1 gigi-personeel 228 Mar 29 23:12 wiel

Het activeringsscript is de sleutel. Om een ​​specifieke virtuele omgeving te activeren, bron je het activeerscript, zoals in: source ~ / venv_1 / bin_activate. Het effect is het instellen van een aantal omgevingsvariabelen en het wijzigen van de prompt in de naam van de geactiveerde virtuele omgeving. Het voegt ook een toe deactiveren () shell-functie die alles opnieuw instelt. Zodra een virtuele omgeving is geactiveerd, typ je Python zal zijn Python lanceren met zijn afhankelijkheden.

~> bron ~ / venv_1 / bin / activate (venv_1) ~> welke python / Gebruikers / gigi / venv_1 / bin / python (venv_1) ~>

Laten we deactiveren:

(venv_1) ~> deactiveer ~> welke python / usr / local / bin / python

Als er meerdere Python-tolken op uw systemen zijn geïnstalleerd, kunt u opgeven welke u wilt gebruiken voor uw virtuele omgeving met behulp van de -p keuze. Hier is een virtuele Python 3-omgeving:

~> virtualenv ~ / venv_3 -p / usr / local / bin / python3 Running virtualenv met interpreter / usr / local / bin / python3 Gebruik van basisprefix '/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework /Versions/3.5 'Nieuw python-bestand in /Users/gigi/venv_3/bin/python3.5 Ook uitvoerbaar maken in / Gebruikers / gigi / venv_3 / bin / python Setuptools installeren, pip ... voltooid. ~> source ~ / venv_3 / bin / activate (venv_3) ~> python Python 3.5.1 (standaard, 9 januari 2016, 19:28:52) [GCC 4.2.1 Compatibele Apple LLVM 7.0.0 (clang-700.1.76 )] op darwin Type "help", "copyright", "credits" of "licentie" voor meer informatie. >>>

Virtualenv werkt zelfs op pypy.

~> virtualenv ~ / venv_pypy -p 'which pypy' Running virtualenv met interpreter / usr / local / bin / pypy Nieuwe pypy uitvoerbaar in / Gebruikers / gigi / venv_pypy / bin / pypy Installeren van setuptools, pip ... klaar. ~> source ~ / venv_pypy / bin / activate (venv_pypy) ~> python Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, 11 februari 2016, 20:39:39) [PyPy 4.0.1 met GCC 4.2.1 compatibel Apple LLVM 7.0.2 ( clang-700.1.81)] op darwin Type "help", "copyright", "credits" of "licentie" voor meer informatie. >>>>

U kunt direct van de ene omgeving naar de andere schakelen zonder eerst te deactiveren:

(venv_3) ~> source ~ / venv_2 / bin / activate (venv_2) ~> welke python / Users / gigi / venv_2 / bin / python

OK. Laten we eens kijken hoe we twee verschillende versies van hetzelfde pakket in twee verschillende virtuele omgevingen kunnen gebruiken. Dit is net zo eenvoudig als het activeren van elke omgeving en het installeren van de gewenste versie. De omgevingen zijn volledig onafhankelijk, dus het feit dat er een andere versie in een andere omgeving is, is een probleem.

Laten we de sh-pakketversie 1.0.0 installeren op "venv_1".

(venv_1) ~> pip install sh == 1.0 Collecting sh == 1.0.0 Downloaden sh-1.0.tar.gz Bouwwielen voor verzamelde pakketten: sh Running setup.py bdist_wheel for sh ... done Opgeslagen in map: / Users / gigi / Bibliotheek / Caches / pip / wheels / f9 / fb / a1 / 383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3 Succesvol gebouwd sh Verzamelen van verzamelde pakketten: sh succesvol geïnstalleerd sh-1.0 (venv_1) ~> pip freeze | grep sh sh == 1.0

Laten we overschakelen naar "venv_2" en versie 1.11 installeren.

(venv_1) ~> source ~ / venv_2 / bin / activate (venv_2) ~> pip-installatie sh == 1.11 Verzamelen sh == 1.11 sh-1.11.tar.gz downloaden Bouwwielen voor verzamelde pakketten: sh Setup.py uitvoeren met bdist_wheel voor sh ... done Opgeslagen in map: / Gebruikers / gigi / Bibliotheek / Caches / pip / wheels / ba / 4f / a5 / ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c Succesvol opgebouwd sh Collectieve pakketten installeren: sh succesvol geïnstalleerd sh-1.11 (venv_2) ~> pip freeze | grep sh sh == 1.11

Laten we nu teruggaan naar "venv_1" en controleren of de versie van het sh-pakket nog steeds 1.0 is.

(venv_2) ~> bron ~ / venv_1 / bin / activate (venv_1) ~> pip freeze | grep sh sh == 1.0 (venv_1) ~>

Virtualenvwrapper

Al dat activeren, deactiveren en schakelen kan na een tijdje oud worden. Als u veel virtuele omgevingen beheert, kan deze uit de hand lopen. Dat is waar virtualenvwrapper binnenkomt. Met Virtualenvwrapper kunt u virtuele omgevingen opsommen, maken, verwijderen en kopiëren. Hiermee kunt u ook gemakkelijk van omgeving wisselen. 

Hier zijn alle opdrachten:

~> virtualenvwrapper virtualenvwrapper is een verzameling extensies van de virtuele tool van Ian Bicking. De uitbreidingen bevatten wrappers voor het maken en verwijderen van virtuele omgevingen en het anders beheren van uw ontwikkelingsworkflow, waardoor het gemakkelijker wordt om aan meer dan één project tegelijk te werken zonder conflicten in hun afhankelijkheden te introduceren. Raadpleeg de documentatie voor meer informatie: http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html Beschikbare opdrachten: add2virtualenv: voeg een map toe aan het importpad allvirtualenv: voer een opdracht uit in alle virtualenvs cdproject: verander map in het actieve project cdsitepackages: verander in de map site-packages cdvirtualenv: ga naar de map $ VIRTUAL_ENV cpvirtualenv: dupliceer de benoemde virtualenv om een ​​nieuwe lssitepackages te maken: lijstinhoud van de map site-pakketten lsvirtualenv: list virtualenvs mkproject: maak een nieuwe project directory en de bijbehorende virtualenv mktmpenv: maak een tijdelijke virtualenv mkvirtualenv: Maak een nieuwe virtualenv in $ WORKON_HOME rmvirtualenv: Verwijder een virtualenv setvirtualenvproject: associeer een projectdirectory met een virtualenv showvirtualenv: toon details van een enkele virtuele toggleglobalsitepackages: draai toegang tot de globale site -pakketten aan / uit virtualenvwrapper: toon dit help-bericht wipeenv: verwijderen alle pakketten geïnstalleerd in de huidige virtualenv workon: lijst of verander werkende virtualenvs

Ik gebruik vrijwel twee commando's: mkvirtualenv en werken aan. Alle virtuele omgevingen zijn gemaakt onder ~ / .Virtualenvironments.

Hier ziet u hoe u een nieuwe virtuele omgeving maakt:

~> mkvirtualenv venv Nieuw uitvoerbaar python in venv / bin / python2.7 Ook uitvoerbaar maken in venv / bin / python Installeren van setuptools, pip ... klaar. (venv) ~>

Dit lijkt op virtualenv, maar u geeft geen map op, alleen een naam. Uw nieuwe omgeving is hier:

(venv) ~> tree -L 2 ~ / .virtualenvs / venv / /Users/gigi/.virtualenvs/venv/ ├── bin │ ├── activeren │ ├── activate.csh │ ├── activate.fish │ ├── activate_this.py │ ├── easy_install │ ├── easy_install-2.7 │ ├── get_env_details │ ├── pip │ ├── pip2 │ ├── pip2.7 │ ├── postactivate │ ├── postdeactivate │ ├── preactivate │ ├── predeactivate │ ├── 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

Om te schakelen tussen omgevingen, gebruikt u de werken aan opdracht, die zonder argumenten alleen alle virtuele omgevingen opsomt. Ik heb er nogal wat:

(venv) ~> workon acme_server conman curr-gen nupic over-presteerder pandas prime_hunter pypy quote-service venv werk (venv) ~> workon conman (conman) ~>

Virtualenv-Burrito

Virtualenv-Burrito is een project om zowel virtualenv als virtualenvwrapper in één opdracht te installeren.

Python 3 Venv

De venv-module is toegevoegd aan Python 3.3 en biedt ingebouwde virtuele omgevingen en beheer, net zoals virtualenv. De opdracht voor het maken van virtuele omgevingen is pyenv. Anders is het vergelijkbaar met virtualenv.

Conda

Virtuele omgevingen zijn erg handig voor het isoleren van afhankelijkheden tussen verschillende projecten. Maar dat geldt niet voor native bibliotheken. Veel C-uitbreidingen zijn afhankelijk van bepaalde versies van native bibliotheken en die kunnen niet specifiek voor de virtuele omgeving zijn. 

Conda kan dit probleem aanpakken. Het is een pakketbeheersysteem dat alle afhankelijkheden afhandelt, niet alleen afhankelijkheden van Python. Het kan zelfs worden gebruikt voor het verpakken van niet-Python-software.

Alternatieven voor virtuele omgevingen

Moet je virtuele omgevingen gebruiken? Niet echt. Als je om wat voor reden dan ook niet dol bent op de magie van virtuele omgevingen, zijn er andere opties.

Handmatig Vendorize

De functionaliteit van een virtuele omgeving is vrij eenvoudig. Als u volledige controle nodig heeft, kunt u het gewoon zelf doen en exact de subset van tools en pakketten die u wilt in een doelmapstructuur kopiëren, een aantal omgevingsvariabelen instellen en u bent klaar om te gaan.

VM of Dockerized System Python

Als u uw toepassingen in een docker-container of een cloud-afbeelding bak, dan is er maar één project en heeft u misschien geen behoefte aan een virtuele omgeving in het midden. Je kunt gewoon op het systeem Python bouwen, en er zeker van zijn dat het niet zal worden veranderd.

Tox

Als het enige waar je om geeft je code onder verschillende tolken en omgevingen test, kan Tox al het zware werk voor je doen. Het zal nog steeds virtuele omgevingen onder de omslagen gebruiken, maar u hoeft er niet mee te werken.

Beste praktijken

Er zijn enkele best practices voor de verpakking en virtuele omgeving die in de loop van de tijd naar voren zijn gekomen voor robuuste Python-systemen.

Pin-versies in uw vereistenbestanden

Vastzetten betekent dat u precies de versies van uw afhankelijkheden specificeert. Als een nieuwe versie wordt uitgebracht en u uw toepassing op een nieuwe server installeert, gebruikt u nog steeds de versie waarvoor u hebt getest en die werkt, en niet de nieuwste en beste. Hier is een nadeel: je moet expliciet versies upgraden als je de voortgang van je afhankelijkheden wilt bijhouden, maar het is meestal de moeite waard.

Gebruik nooit de systeempython

Vertrouwen op de systeemversie is een slechte gewoonte, omdat er andere hulpprogramma's zijn die ervan afhankelijk zijn en als u begint met het bijwerken van systeempakketten, kunt u deze breken. Mogelijk wordt u ook getroffen door beveiligingsupdates die systeempakketten wijzigen of, in het algemeen, als u uw besturingssysteem wilt upgraden, merkt u mogelijk dat het systeem Python nu anders is.

Gebruik een privépakketindex bij het bakken van afbeeldingen

PyPI is mogelijk niet beschikbaar. Als je een nieuwe afbeelding moet bakken en geen toegang hebt tot PyPI, zit je in de problemen. Devpi is een goede optie om frustratie te voorkomen.

Conclusie

Er zijn veel opties om meerdere Python-projecten op dezelfde machine te beheren zonder conflicten. Zoek uit welke optie het beste bij u past en gebruik deze. Het is snel en eenvoudig om virtuele omgevingen te creëren. Aarzel niet om te profiteren van deze handige tool. Als u speciale vereisten heeft, zijn er ook veel oplossingen.