Medii virtuale Python

Prezentare generală

Mulți dintre noi lucrăm pe mai multe proiecte Python în același timp. Proiectele multiple pot depinde de diferite versiuni ale aceleiași biblioteci. Aceasta este o problemă. Chiar dacă lucrați cu un singur proiect și îl implementați în producție, este posibil să aveți probleme, deoarece sistemul Python de pe serverul dvs. de producție se poate schimba din cauza upgrade-ului de sistem sau a patch-ului de securitate, iar aplicația dvs. ar putea să nu reușească. În general, doriți un control deplin asupra mediului Python al proiectelor dvs. Introduceți medii virtuale ...

Ideea de bază a unui mediu virtual este de a avea un interpret Python și pachetele de site-uri separate de cel de sistem. De asemenea, puteți avea mulți dintre ei. Asta rezolvă ambele probleme. Puteți atribui un mediu virtual separat cu propriile dependențe pentru fiecare proiect și să uitați de conflictele cu alte proiecte și Python-ul sistemului.

În acest tutorial, veți învăța conceptele din spatele mediilor virtuale și cum să le creați și să le utilizați și veți descoperi diverse alternative pentru situații speciale.

Virtualenv

Pachetul virtualev susține acest concept. Puteți instala virtualenv folosind pip instalare virtualenv.

Odată instalat virtualenv, puteți începe să creați medii virtuale. Să creați două medii numite "venv_1" și "venv_2".

~> Virtualenv ~ / venv_1 Utilizarea prefix real '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' executabil nou în Python /Users/gigi/venv_1/bin/python2.7 De asemenea, crearea executabilului în / Users / gigi / venv_1 / bin / python Instalarea instrumentelor de instalare, pip, roată ... terminat. ~> Virtualenv ~ / venv_2 Utilizarea prefix real '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7' executabil nou în Python /Users/gigi/venv_2/bin/python2.7 De asemenea, crearea executabilului în / Users / gigi / venv_2 / bin / python Instalarea instrumentelor de configurare, pip, roată ... făcut.

Să vedem ce s-a întâmplat.

~> ls -la ~ / venv_1 total 16 drwxr-xr-x 7 gigi personal 238 Mar 29 23:12. drwxr-xr-x + 254 personal gigi 8636 29 martie 23: 12 ... lrwxr-xr-x 1 gigi personal 79 29 martie 23:12 .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python. cadru / versiuni / 2.7 / Python drwxr-xr-x 16 544 personal gigi Mar personal 29 23:12 bin drwxr-xr-x 3 gigi 102 Mar 29 23:12 includ drwxr-xr-x 3 personalul gigi 102 Mar 29 23: 12 lib-rw-r - r-- 1 gigi personal 60 Mar 29 23:12 pip-selfcheck.json

În directorul "bin", veți găsi câteva executabile și simboluri. Acestea includ interpretul Python în sine, pip, easy_install și, cel mai important, câteva script-uri de activare.

~> ls -la ~ / venv_1 / bin total 136 drwxr-xr-x 16 gigi personal 544 29 Mar 29 23:12. drwxr-xr-x 7 gigi personal 238 Mar 29 23: 12 ... -rw-r-r-- 1 gigi personal 2077 Mar 29 23:12 activate -rw-r - r-- 1 gigi staff 1019 Mar 29 23 : 12 activate.csh -rw-r-r-- 1 staff gigi 2217 Mar 29 23:12 activate.fish -rw-r-r-- 1 staff gigi 1137 Mar 29 23:12 activate_this.py -rwxr- xr-x 1 249 personal gigi 29 martie 23:12 easy_install -rwxr-xr-x 1 gigi personal 249 29 martie 23:12 easy_install-2.7 -rwxr-xr-x personal 1 221 gigi 29 martie 23:12 pip -rwxr- xr-x 1 221 personal gigi Mar 29 23:12 PIP2 -rwxr-xr-x 1 221 Mar personal gigi personal 29 23:12 pip2.7 lrwxr-xr-x 1 gigi 09 martie 29 23:12 piton -> python2. 7 -rwxr-xr-x personal 1 gigi 2336 Mar de 29 23:12 piton-config personal lrwxr-xr-x 1 gigi 09 martie 29 23:12 python2 -> python2.7 -rwxr-xr-x 1 gigi personal 12744 Mar 29 23:12 python2.7 -rwxr-xr-x 1 gigi personal 228 Mar 29 23:12 roată

Scenariul de activare este cheia. Pentru a activa un anumit mediu virtual, sursa scriptului de activare, ca în: sursa ~ / venv_1 / bin_activate. Efectul este setarea unei mulțimi de variabile de mediu și schimbarea solicitării către numele mediului virtual activat. De asemenea, adaugă a dezactiva () shell care va reseta totul. Odată ce un mediu virtual este activat, tastați piton va lansa Python-ul cu dependențele sale.

~ / source / venv_1 / bin / activate (venv_1) ~> care python / Users / gigi / venv_1 / bin / python (venv_1)

Să dezactivați:

(venv_1) ~> dezactivați ~> care python / usr / local / bin / python

Dacă aveți mai mulți interpreți Python instalați pe sistemele dvs., puteți specifica care dintre acestea să se utilizeze pentru mediul dvs. virtual utilizând -p opțiune. Iată un mediu virtual Python 3:

~> Virtualenv ~ / venv_3 -p / usr / local / bin / python3 Rularea virtualenv cu interpret / usr / local / bin / python3 Utilizarea prefixului de bază „/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework /Versions/3.5 'Nou executabil python în /Users/gigi/venv_3/bin/python3.5 De ​​asemenea, creând executabil în / Users / gigi / venv_3 / bin / python Instalarea setuptools, pip ... done. ~> source / venv_3 / bin / activate (venv_3) ~> Python Python 3.5.1 (implicit, 9 ianuarie 2016, 19:28:52) [GCC 4.2.1 Apple LLVM 7.0.0 compatibil (clang-700.1.76 )] despre Darwin Tipul "ajutor", "drepturi de autor", "credite" sau "licență" pentru mai multe informații. >>>

Virtualenv funcționează chiar și pe pisici.

~> Virtualenv ~ / venv_pypy -p 'care pypy' Running virtualenv cu interpret / usr / local / bin / pypy executabil nou pypy în / Users / gigi / venv_pypy / bin / pypy Instalarea setuptools, ... PIP făcut. ~> Sursa ~ / venv_pypy / bin / Activate (venv_pypy) ~> Python Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, 11 Feb 2016, 20:39:39) [PyPy 4.0.1 cu GCC 4.2.1 Compatibil Apple a LLVM 7.0.2 ( clang-700.1.81)] despre tipul "ajutor", "copyright", "credite" sau "licență" pentru mai multe informații. >>>>

Puteți comuta direct de la un mediu la altul fără a dezactiva mai întâi:

(venv_3) ~> sursa ~ / venv_2 / bin / activate (venv_2) ~> care python / Users / gigi / venv_2 / bin / python

O.K. Să vedem cum să folosim două versiuni diferite ale aceluiași pachet în două medii virtuale diferite. Acest lucru este la fel de simplu ca activarea fiecărui mediu și instalarea versiunii dorite. Mediile sunt complet independente, deci faptul că există o altă versiune într-un alt mediu nu este o problemă.

Să instalăm pachetul sh 1.0.0 la "venv_1".

(venv_1) ~> pip install sh == 1.0 Colectarea sh == 1.0.0 Descărcarea sh-1.0.tar.gz Roți de construcție pentru pachetele colectate: sh Running setup.py bdist_wheel pentru sh ... terminat Stocat în directorul: / Users / gigi / Library / Caches / pip / jante / f9 / fb / a1 / 383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3 cu succes construit sh instalarea pachetelor colectate: sh instalat cu succes sh-1.0 (venv_1) ~> pip prin congelare | grep sh sh = = 1,0

Să trecem la "venv_2" și să instalăm versiunea 1.11.

(venv_1) ~> sursa ~ / venv_2 / bin / activate (venv_2) ~> pip install sh == 1.11 Colectarea sh == 1.11 Descarcarea sh-1.11.tar.gz Roti de constructii pentru pachetele colectate: sh Running setup.py bdist_wheel for sh ... done sunt înregistrate în directorul: / Users / gigi / Library / Caches / pip / roți / BA / 4F / a5 / ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c pachete colectate sh instalarea cu succes construite: sh instalat cu succes sh-1,11 (venv_2) ~> pip congelare | grep sh sh == 1.11

Acum, să revenim la "venv_1" și să verificăm că versiunea sa a pachetului sh este încă 1.0.

(venv_2) ~> sursa ~ / venv_1 / bin / activate (venv_1) ~> pip congela | grep sh sh == 1.0 (venv_1) ~>

Virtualenvwrapper

Toate activarea, dezactivarea și comutarea pot deveni vechi după un timp. Dacă gestionați o mulțime de medii virtuale, acesta poate scăpa de sub control. Aici vine virtualenvwrapper. Virtualenvwrapper vă permite să listați, să creați, să ștergeți și să copiați medii virtuale. De asemenea, vă permite să schimbați ușor mediile. 

Iată toate comenzile:

~> virtualenvwrapper virtualenvwrapper este un set de extensii la instrumentul virtualenv al lui Ian Bicking. Extensiile includ pachete pentru crearea și ștergerea mediilor virtuale și gestionarea în alt mod a fluxului de lucru pentru dezvoltare, făcând mai ușoară lucrul la mai multe proiecte simultan fără a introduce conflicte în dependențele lor. Pentru mai multe informații vă rugăm să consultați documentația: http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html Comenzi disponibile: add2virtualenv: adăugați directorul la allvirtualenv calea de import: executați o comandă în toate virtualenvs cdproject: schimbați directorul active cdsitepackages proiectului: schimbare la cdvirtualenv directorul site-ul de pachete: schimbare la $ VIRTUAL_ENV directorul cpvirtualenv: duplica virtualenv numit pentru a face un nou unul lssitepackages: conținutul listei de lsvirtualenv director site-ul pachete: lista virtualenvs mkproject: a crea un nou director de proiect și mktmpenv sale virtualenv asociate: a crea un mkvirtualenv virtualenv temporară: Creați un nou virtualenv în $ WORKON_HOME rmvirtualenv: Eliminarea unui setvirtualenvproject virtualenv: asociază un director de proiect, cu un showvirtualenv virtualenv: afișează detaliile unui singur toggleglobalsitepackages virtualenv: rândul său, accesul la site-ul mondial -pachete on / off virtualenvwrapper: afișați acest mesaj de ajutor wipeenv: eliminați toate pachetele instalate în lucrarea virtuală curentă: lista sau modificarea virtualelor de lucru

Eu folosesc cam două comenzi: mkvirtualenv și workon. Toate mediile virtuale sunt create sub ~ / .Virtualenvironments.

Iată cum puteți crea un nou mediu virtual:

~> mkvirtualenv venv Nou executabil python în venv / bin / python2.7 De asemenea, crearea executabil în venv / bin / python Instalarea setuptools, pip ... făcut. (venv) ~>

Acest lucru este similar cu virtualenv, dar nu specificați un director, doar un nume. Noul dvs. mediu este aici:

(Venv) ~> arbore -L 2 ~ / .virtualenvs / venv / /Users/gigi/.virtualenvs/venv/ ├── bin │ ├── Activate │ ├── activate.csh │ ├── activate.fish │ ├── activate_this.py │ ├── easy_install │ ├── easy_install-2.7 │ ├── get_env_details │ ├── pip │ ├── PIP2 │ ├── pip2.7 │ ├── postactivate │ ├── postdeactivate │ ├── preactiveze │ ├── predeactivate │ ├── piton -> python2.7 │ ├── python2 -> python2.7 │ └── python2.7 ├── includ │ └── python2.7 -> /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/include/python2.7 └───────────────────────────────────────────────────────────────────────────

Pentru a comuta între medii, utilizați workon care, fără argumente, afișează doar toate mediile virtuale. Am destul:

(venv) ~> workon acme_server conman curr-gen nupic peste-obtinerea pandas prim_hunter pirat quote-service venv lucrare (venv) ~> workon conman (conman) ~>

Virtualenv-Burrito

Virtualenv-Burrito este un proiect pentru a instala atât virtualenv, cât și virtualevwrapper într-o singură comandă.

Python 3 Venv

Modulul venv a fost adăugat în Python 3.3 și oferă crearea și gestionarea mediului virtual construit, la fel ca virtualenv. Comanda pentru crearea de medii virtuale este pyenv. În caz contrar, este destul de similar cu virtualenv.

Conda

Mediile virtuale sunt foarte utile pentru izolarea dependențelor între diferite proiecte. Dar asta nu se extinde la bibliotecile native. Multe extensii C depind de versiuni speciale ale bibliotecilor native și nu pot fi specifice unui mediu virtual. 

Conda poate rezolva această problemă. Este un sistem de gestionare a pachetelor care gestionează toate dependențele, nu doar dependențele de Python. Poate fi folosit și pentru ambalarea software-ului non-Python.

Alternative la mediile virtuale

Trebuie să utilizați medii virtuale? Nu chiar. Dacă dintr-un anumit motiv nu sunteți îndrăgostiți de magia mediilor virtuale, există și alte opțiuni.

Vânzați manual

Funcționalitatea unui mediu virtual este destul de simplă. Dacă aveți nevoie de control total, puteți să o faceți singur și să copiați exact subsetul de instrumente și pachete pe care le doriți într-o structură de director țintă, să configurați unele variabile de mediu și sunteți bine să mergeți.

VM sau sistem Dockerized Python

Dacă coaceți aplicațiile într-un container de docer sau într-o imagine cloud, atunci va exista un singur proiect și este posibil să nu aveți nevoie de un mediu virtual în mijloc. Puteți construi doar pe partea de sus a sistemului Python, fiind sigur că nu va fi schimbat.

Tox

Dacă tot ce vă interesează este testarea codului dvs. sub interpreți și medii diferite, atunci Tox poate face toată ridicarea greu pentru tine. În continuare se vor folosi medii virtuale sub capace, dar nu trebuie să le rezolvi.

Cele mai bune practici

Există unele practici de ambalare și de mediu virtuale care au apărut de-a lungul timpului pentru sisteme robuste Python.

Versiuni Pin în fișierele cu cerințe

Pinning înseamnă a specifica exact versiunile dependențelor tale. Dacă va apărea o nouă versiune și veți instala aplicația pe un server nou, veți utiliza în continuare versiunea pe care ați testat-o ​​și care funcționează, și nu cea mai recentă și cea mai bună. Există un dezavantaj aici - va trebui să actualizați în mod explicit versiunile dacă doriți să țineți pasul cu progresul făcut de dependențele dvs. - dar de obicei merită.

Niciodată Nu utilizați sistemul Python

Bazându-se pe versiunea sistemului, este o practică proastă, deoarece există și alte instrumente care se bazează pe ea, iar dacă începeți să actualizați pachetele de sistem, le puteți rupe. De asemenea, este posibil să fiți afectați de actualizările de securitate care modifică pachetele de sistem sau, în general, dacă doriți să vă actualizați sistemul de operare, veți găsi că sistemul Python este acum diferit.

Utilizați un index pachet privat la coacerea imaginilor

PyPI poate fi în jos. Dacă aveți nevoie să coaceți o nouă imagine și nu puteți accesa PyPI, aveți probleme. Devpi este o opțiune bună pentru a evita frustrarea.

Concluzie

Există multe opțiuni pentru gestionarea mai multor proiecte Python pe aceeași mașină fără conflicte. Aflați care este cea mai bună opțiune pentru dvs. și folosiți-o. Este rapid și ușor de creat medii virtuale. Nu ezitați să profitați de acest instrument util. Dacă aveți cerințe speciale, există și multe soluții.

Cod