12. Virtuális környezetek és csomagok

12.1. Bevezetés

A Python-alkalmazások gyakran használnak csomagokat és modulokat, amelyek nem részei a sztenderd könyvtárnak. Egyes alkalmazásoknak néha egy könyvtárnak egy speciális verziójára van szüksége, mert az alkalmazás feltételezi, hogy egy bizonyos hibát javította, vagy esetleg az alkalmazás a könyvtárnak egy idejétmúlt verziójához készült.

Ez azt jelenti, hogy talán nem elég egyetlen Python telepítése, hogy az összes alkalmazás igényeit kielégítse. Ha az A alkalmazásnak egy modul 1.0-ás verziójára van szüksége, a B alkalmazásnak pedig a 2.0-ásra, ez konfliktust okoz, és akár az 1.0-ás, akár a 2.0-ás verziót telepítem, az egyik alkalmazás képtelen lesz működni.

Erre a problémára az a megoldás, hogy virtuális környezet-et hozunk létre: egy könyvtárstruktúrát, amelyben egy Python van telepítve egy bizonyos Python-verzióval, és pár további csomaggal.

A különböző alkalmazások így különböző virtuális környezeteket használhatnak. Ahhoz, hogy a korábbi példa ellentmondásos követelményeit feloldjuk, az A alkalmazás ezután a saját virtuális környezetét használhatja, amelyben az 1.0-ás verzió került telepítésre, a B alkalmazás egy másik virtuális környezetet, amelyben a 2.0-ás. Ha a B alkalmazás könyvtárát 3.0-ásra kell frissíteni, az nem befolyásolja az A alkalmazás környezetét.

12.2. Virtuális környezet létrehozása

A modult, amely képes virtuális környezetek létrehozására és kezelésére, venv-nek hívják. A venv gyakran a Python legfrissebb elérhető verzióját telepítik. Ha többféle Python-verzióra van szükségünk a rendszerünkön, a kiválaszthatunk egy speciális Python-verziót, a python3 futtatásával, vagy amelyik verziót csak akarjuk.

Egy virtuális környezet létrehozásához határozzuk el, melyik könyvtárba szeretnénk helyezni, és futtassuk a venv modult szkriptként evvel a könyvtár-útvonallal:

python3 -m venv oktato-kornyezet

Ez létrehoz egy oktato-kornyezet nevű könyvtárat, ha még nem létezik, és létrehoz újabb könyvtárakat ezen belül, amely tartalmazza a Python-értelmezőt, a sztenderd könyvtárat, és különböző támogató fájlokat.

Amikor létrehoztuk a virtuális környezetet, aktiválhatjuk.

Windowson így:

oktato-kornyezet\Scripts\activate.bat

Unixon (beleértve a Linuxokat) vagy MacOS-en így:

source tutorial-env/bin/activate

(Ez a szkript bash-shellhez készült. Ha csh vagy fish shellt használunk, akkor a activate.csh illetve activate.fish szkripteket kell használnunk.)

A virtuális környezet megváltoztatása a shell-promptot is megváltoztatja, hogy mutassa, melyik virtuális környezetben vagyunk, és úgy módosítja a környezetet, hogy a python parancs futtatása a megfelelő Python-verziót és telepítést futtassa. Például:

$ source ~/envs/oktato-kornyezet/bin/activate
(oktato-kornyezet) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/oktato-kornyezet/lib/python3.5/site-packages']
>>>

12.3. Csomagkezelés pip-pel

Telepíthetünk, frissíthetünk és eltávolíthatunk csomagokat a pip programmal. Alapból a pip a Python Package Indexből, <https://pypi.python.org/pypi>, telepíti a programokat. Böngészhetjük a Python Package Indexet a webböngészőnkben, vagy használhatjuk a pip korlátozott keresési lehetőségeit:

(oktato-kornyezet) $ pip search astronomy
skyfield               - Elegant astronomy for Python
gary                   - Galactic astronomy and gravitational dynamics.
novas                  - The United States Naval Observatory NOVAS astronomy library
astroobs               - Provides astronomy ephemeris to plan telescope observations
PyAstronomy            - A collection of astronomy related tools for Python.
...

A pip-nek van néhány alparancsa: “search”, “install”, “uninstall”, “freeze”, stb. (A pip teljes dokumentációja elérhető itt Installing Python Modules.)

A csomag legfrissebb verzióját a csomagnév megadásával telepíthetjük:

(oktato-kornyezet) $ 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

A csomag egy adott verzióját is telepíthetjük, ha megadjuk a csomag nevét, amelyet == követ, majd a verziószám:

(oktato-kornyezet) $ 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

Ha ezt ismét futtatjuk, akkor a pip észre fogja venni, hogy a kívánt változat már telepítve van, és nem tesz semmit. Egy másik verziószámot is beírhatunk, ha azt szeretnénk telepíteni, vagy futtathatjuk a pip install --upgrade parancsot, hogy a legfrissebb változatra frissítsünk:

(oktato-kornyezet) $ 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

A pip uninstall parancs egy vagy több csomagnévvel folytatva eltávolítja a csomagokat a virtuális környezetből.

A pip show parancs tájékoztat a megadott csomag részleteiről:

(oktato-kornyezet) $ 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:

A pip list megjeleníti a virtuális környezetbe telepített összes csomagot:

(oktato-kornyezet) $ pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)

A pip freeze hasonló listát készít a telepített csomagokról, de a kimenet olyan formát használ, amilyet a pip install vár. Általában ezt a listát a requirements.txt fájlba szoktuk helyezni:

(oktato-kornyezet) $ pip freeze > requirements.txt
(oktato-kornyezet) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

A requirements.txt ezután feltölthető a verziókövető rendszerbe, és az alkalmazással együtt közzétehető. Ekkor a felhasználók a szükséges csomagokat az install -r paranccsal telepíthetik:

(oktato-kornyezet) $ 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

A pip sok más lehetőséget is rejt. A Installing Python Modules útmutatóban megtalálható a pip teljes dokumentációja. Ha saját csomagot hoztunk létre, amelyet elérhetővé szeretnénk tenni a Python Package Indexen, akkor a következő útmutatót érdemes elolvasnunk Distributing Python Modules.