12. Medii virtuale și pachete¶
12.1. Introducere¶
Aplicațiile Python folosesc adesea pachete și module care nu fac parte din biblioteca standard. În diverse situații, o aplicație necesită o versiune anumită a unei biblioteci, dat fiind că aplicația în cauză se bazează pe faptul că o defecțiune de cod, din bibliotecă, a fost corectată în versiunea respectivă sau, dimpotrivă, codul aplicației a fost realizat cu elemente dintr-o versiune depășită a interfeței bibliotecii în cauză.
De aceea, se poate întâmpla ca o singură instalare a sistemului Python în calculatorul dumneavoastră să nu poată îndeplini în totalitate cerințele tuturor aplicațiilor pe care intenționați să le folosiți. Dacă, să zicem, aplicația A necesită versiunea 1.0 a modulului cutare pe când aplicația B solicită prezența versiunii 2.0 a respectivului modul, atunci cerințele intră în conflict una cu cealaltă, deci, indiferent pe care dintre versiuni am instala-o, una din aplicațiile A, B nu va putea funcționa.
Soluția unei asemenea probleme este să creăm un virtual environment, adică un arbore de directoare în care să se găsească o instalare (auto-conținută) completă a sistemului Python corespunzând unei versiuni precizate a Python-ului, instalare căreia să îi fie adăugate un număr de pachete de interes particular.
Astfel, aplicații diferite vor putea fi rulate în medii virtuale diferite. Ca o rezolvare a conflictului de cerințe din exemplul anterior, aplicația A va putea dispune de propriul mediu virtual, în care a fost instalată versiunea 1.0 a modulului respectiv, în timp ce aplicația B va avea la dispoziție alt mediu virtual, cu versiunea 2.0 a aceluiași modul în funcțiune. Presupunând că, în urma unei actualizări, aplicația B va avea nevoie de versiunea 3.0 a unei biblioteci oarecare, instalarea ei nu va afecta în niciun fel mediul aplicației A.
12.2. Crearea de medii virtuale¶
Modulul întrebuințat la crearea și administrarea mediilor virtuale (de execuție, de testare, șamd.) se numește venv
. Acest venv
va instala acea versiune de Python pe care o folosim la rularea comenzii de instalare în terminal (și pe care o putem evidenția cu opțiunea --version
). De exemplu, dacă executăm comanda cu python3.12
, se va instala versiunea 3.12.
Pentru a crea un mediu virtual, decideți-vă asupra unui director în care să îl plasați, apoi rulați modulul venv
ca script, furnizându-i calea de acces către directorul convenabil:
python -m venv tutorialul_de_python_un_mediu_virtual
Execuția comenzii (de către interpretor) va crea directorul tutorialul_de_python_un_mediu_virtual
, dacă acesta nu există deja, apoi va crea și restul (sub)directoarelor sale, în care se vor găsi o copie a interpretorului de Python și varii fișiere ajutătoare.
O alegere frecventă în privința directorului unui mediu virtual este dată de .venv
. Un atare nume va face ca directorul să le fie ascuns comenzilor interpretorului de comenzi (de la englezescul, ca jargon informatic, shell) activ în terminalul din care lucrați și, din acest motiv, să nu le fie obstacol acestora, respectiv el nu va avea nevoie de explicații despre motivul pentru care există (atunci când, la câteva luni de la ultima sa folosire, veți fi uitat că face parte din sistemul de directoare). În plus, alegerea acestui nume va elimina potențialele conflicte cu fișierele .env
, care conțin definițiile unor variabile de mediu, cerute de diverse unelte informatice.
De îndată ce ați creat un mediu virtual, îl puteți activa.
În Windows, rulați:
tutorialul_de_python_un_mediu_virtual\Scripts\activate
În Unix sau MacOS, rulați:
source tutorialul_de_python_un_mediu_virtual/bin/activate
(Acest script de activare a fost scris pentru interpretorul de comenzi bash. Dacă îl folosiți ca interpretor fie pe csh fie pe fish, atunci va trebui să utilizați scripturile corespunzătoare, activate.csh
ori activate.fish
.)
Activarea mediului virtual va schimba promptul interpretorului de comenzi pe care îl întrebuințați în terminal pentru a vă informa ce mediu virtual este în funcțiune, respectiv va modifica mediul pentru ca rularea comenzii python
să vă conducă chiar la versiunea (special) instalată de Python cu care doriți să lucrați. De exemplu:
$ source ~/envs/tutorialul_de_python_un_mediu_virtual/bin/activate
(tutorialul_de_python_un_mediu_virtual) $ python
Python 3.5.1 (default, May 6 2016, 10:59:36)
...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorialul_de_python_un_mediu_virtual/lib/python3.5/site-packages']
>>>
Pentru a dezactiva un mediu virtual, tastați:
deactivate
în (linia de comandă din) terminal.
12.3. Administrarea pachetelor cu pip¶
Putem instala, actualiza și elimina pachete cu ajutorul unui program intitulat pip. În mod prestabilit, pip
instalează pachete preluate din Python Package Index (adică, PyPI; Catalogul pachetelor Python). Pentru a putea răsfoi catalogul, este suficient să îi vizitați pagina web.
pip
are un număr de sub-comenzi (cu sintaxa pip nume_de_subcomandă): „install”, „uninstall”, „freeze”, șamd. (Consultați ghidul Installing Python Modules pentru o documentație amănunțită referitoare la pip
.)
Puteți instala cea mai recentă versiune a unui pachet (precum novas) specificându-i numele în comanda:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
De asemeni, puteți instala o anumită versiune a unui pachet (requests) introducându-i numele (în comandă), urmat de un ==
și de numărul versiunii dorite:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
În caz că re-executați comanda, pip
vă va informa că versiunea solicitată este deja instalată, după care nu va mai face nimic. Desigur, pentru a instala altă versiune (a aceluiași pachet), va fi nevoie să îi introduceți numărul (de versiune) sau veți putea rula comanda python -m pip install --upgrade
pentru a actualiza pachetul, punându-i în uz cea mai recentă versiune:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
python -m pip uninstall
urmat de unul ori de mai multe nume de pachete va elimina, în urma execuției, pachetele respective din mediul virtual.
python -m pip show
va afișa informații despre un pachet precizat:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorialul_de_python_un_mediu_virtual/lib/python3.4/site-packages
Requires:
python -m pip list
va afișa toate pachetele instalate în mediul virtual:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
python -m pip freeze
va produce o listă asemănătoare celei de deasupra, cu excepția faptului că formatul acestei liste este identic celui solicitat de comanda python -m pip install
. O convenție populară ne spune că lista produsă de freeze trebuie să fie salvată într-un fișier text cu nume sugestiv, precum cerințe.txt
:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip freeze > cerințe.txt
(tutorialul_de_python_un_mediu_virtual) $ cat cerințe.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
În această situație, fișierul cerințe.txt
va putea fi comis către (baza de date a platformei de ) controlul versiunii, respectiv livrat (către beneficiari) ca parte a aplicației construite de dumneavoastră. Drept urmare, utilizatorii acesteia vor putea să își instaleze pachetele de care are nevoie aplicația folosind install -r
:
(tutorialul_de_python_un_mediu_virtual) $ python -m pip install -r cerințe.txt
Collecting novas==3.1.1.3 (from -r cerințe.txt (line 1))
...
Collecting numpy==1.9.2 (from -r cerințe.txt (line 2))
...
Collecting requests==2.7.0 (from -r cerințe.txt (line 3))
...
Installing collected packages: novas, numpy, requests
Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
pip
are numeroase alte opțiuni. Consultați ghidul Installing Python Modules pentru documentația elaborată a lui pip
. Dacă ați construit deja un pachet Python și doriți să îl faceți disponibil în catalogul PyPI, vă recomandăm să parcurgeți materialul Python packaging user guide.