# 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 mediu virtual, 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

The module used to create and manage virtual environments is called `venv`. `venv` will usually install the most recent version of Python that you have available. If you have multiple versions of Python on your system, you can select a specific Python version by running `python3` or whichever version you want.

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 tutorial-env

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:

    tutorial-env\Scripts\activate.bat

În Unix sau MacOS, rulați:

    source tutorial-env/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/tutorial-env/bin/activate
    (tutorial-env) $ python
    Python 3.5.1 (default, May  6 2016, 10:59:36)
      ...
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python35.zip', ...,
    '~/envs/tutorial-env/lib/python3.5/site-packages']
    >>>

## 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 Instalarea modulelor Python 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:

    (tutorial-env) $ 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:

    (tutorial-env) $ 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

If you re-run this command, `pip` will notice that the requested version is already installed and do nothing. You can supply a different version number to get that version, or you can run `pip install --upgrade` to upgrade the package to the latest version:

    (tutorial-env) $ 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

`pip uninstall` followed by one or more package names will remove the packages from the virtual environment.

`pip show` will display information about a particular package:

    (tutorial-env) $ 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/tutorial-env/lib/python3.4/site-packages
    Requires:

`pip list` will display all of the packages installed in the virtual environment:

    (tutorial-env) $ pip list
    novas (3.1.1.3)
    numpy (1.9.2)
    pip (7.0.3)
    requests (2.7.0)
    setuptools (16.0)

`pip freeze` will produce a similar list of the installed packages, but the output uses the format that `pip install` expects. A common convention is to put this list in a `requirements.txt` file:

    (tutorial-env) $ pip freeze > requirements.txt
    (tutorial-env) $ cat requirements.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`:

    (tutorial-env) $ python -m pip install -r requirements.txt
    Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
      ...
    Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
      ...
    Collecting requests==2.7.0 (from -r requirements.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` has many more options. Consult the Installing Python Modules guide for complete documentation for `pip`. When you’ve written a package and want to make it available on the Python Package Index, consult the Distributing Python Modules guide.