12. Virtuella miljöer och paket

12.1. Introduktion

Python-applikationer använder ofta paket och moduler som inte ingår i standardbiblioteket. Applikationer behöver ibland en specifik version av ett bibliotek, eftersom applikationen kan kräva att en viss bugg har åtgärdats eller applikationen kan vara skriven med en föråldrad version av bibliotekets gränssnitt.

Detta innebär att det kanske inte är möjligt för en Python-installation att uppfylla kraven för alla applikationer. Om program A behöver version 1.0 av en viss modul men program B behöver version 2.0, så står kraven i konflikt med varandra och om man installerar antingen version 1.0 eller 2.0 kommer ett program inte att kunna köras.

Lösningen på det här problemet är att skapa en virtuell miljö, ett fristående katalogträd som innehåller en Python-installation för en viss version av Python, plus ett antal ytterligare paket.

Olika applikationer kan då använda olika virtuella miljöer. För att lösa det tidigare exemplet med motstridiga krav kan applikation A ha en egen virtuell miljö med version 1.0 installerad medan applikation B har en annan virtuell miljö med version 2.0. Om applikation B kräver att ett bibliotek ska uppgraderas till version 3.0 påverkar detta inte applikation A:s miljö.

12.2. Skapa virtuella miljöer

Modulen som används för att skapa och hantera virtuella miljöer heter venv. venv installerar den Python-version som kommandot kördes från (vilket rapporteras av alternativet --version). Om du till exempel kör kommandot med python3.12 installeras version 3.12.

För att skapa en virtuell miljö bestämmer du en katalog där du vill placera den och kör modulen venv som ett skript med katalogsökvägen:

python -m venv tutorial-env

Detta skapar katalogen tutorial-env om den inte redan finns, och skapar även kataloger i den som innehåller en kopia av Python-tolken och olika stödfiler.

En vanlig katalogplats för en virtuell miljö är .venv. Det här namnet gör att katalogen vanligtvis är dold i ditt skal och därmed inte är i vägen samtidigt som den får ett namn som förklarar varför katalogen finns. Det förhindrar också krockar med .env definitionsfiler för miljövariabler som vissa verktyg stöder.

När du har skapat en virtuell miljö kan du aktivera den.

I Windows kör du:

tutorial-env\Scripts\activate

På Unix eller MacOS kör du:

source tutorial-env/bin/activate

(Det här skriptet är skrivet för bash-skalet. Om du använder skalen csh eller fish finns det alternativa skript activate.csh och activate.fish som du bör använda istället)

Om du aktiverar den virtuella miljön ändras skalets prompt så att den visar vilken virtuell miljö du använder och miljön ändras så att du får den specifika versionen och installationen av Python om du kör python. Ett exempel:

$ 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']
>>>

Om du vill inaktivera en virtuell miljö skriver du:

deactivate

in i terminalen.

12.3. Hantera paket med pip

Du kan installera, uppgradera och ta bort paket med hjälp av ett program som heter pip. Som standard installerar pip paket från Python Package Index. Du kan bläddra i Python Package Index genom att gå till det i din webbläsare.

pip har ett antal underkommandon: ”install”, ”uninstall”, ”freeze”, etc. (Se guiden Installera Python-moduler för fullständig dokumentation för pip)

Du kan installera den senaste versionen av ett paket genom att ange paketets namn:

(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

Du kan också installera en specifik version av ett paket genom att ange paketnamnet följt av == och versionsnumret:

(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

Om du kör det här kommandot igen kommer pip att märka att den begärda versionen redan är installerad och inte göra någonting. Du kan ange ett annat versionsnummer för att hämta den versionen, eller så kan du köra python -m pip install --upgrade för att uppgradera paketet till den senaste versionen:

(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

python -m pip uninstall följt av ett eller flera paketnamn tar bort paketen från den virtuella miljön.

python -m pip show visar information om ett visst paket:

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

python -m pip list visar alla paket som är installerade i den virtuella miljön:

(tutorial-env) $ python -m pip lista
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
förfrågningar (2.7.0)
setuptools (16.0)

python -m pip freeze kommer att producera en liknande lista över de installerade paketen, men utdata använder det format som python -m pip install förväntar sig. En vanlig konvention är att lägga den här listan i filen requirements.txt:

(handledning-env) $ python -m pip freeze > krav.txt
(handledning-env) $ cat krav.txt
novas==3.1.1.3
numpy==1.9.2
förfrågningar==2.7.0

requirements.txt kan sedan överföras till versionskontroll och levereras som en del av en applikation. Användare kan sedan installera alla nödvändiga paket med 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 har många fler alternativ. Se guiden Installera Python-moduler för fullständig dokumentation för pip. När du har skrivit ett paket och vill göra det tillgängligt på Python Package Index, se Python packaging user guide.