12. Virtuelle Umgebungen und Pakete

12.1. Einführung

Python-Anwendungen verwenden häufig Pakete und Module, die nicht Teil der Standardbibliothek sind. Manchmal benötigen Anwendungen eine bestimmte Version einer Bibliothek, da entweder ein bestimmter Fehler behoben sein muss oder die Anwendung unter Verwendung einer veralteten Version der Bibliotheksschnittstelle geschrieben wurde.

Das bedeutet, dass es unter Umständen nicht möglich ist, mit einer einzigen Python-Installation die Anforderungen aller Anwendungen zu erfüllen. Wenn Anwendung A die Version 1.0 eines bestimmten Moduls benötigt, Anwendung B jedoch die Version 2.0, stehen die Anforderungen im Konflikt miteinander, und die Installation entweder von Version 1.0 oder 2.0 führt dazu, dass eine der Anwendungen nicht ausgeführt werden kann.

Die Lösung für dieses Problem besteht darin, eine virtuelle Umgebung anzulegen – einen in sich geschlossenen Verzeichnisbaum, der eine Python-Installation für eine bestimmte Python-Version sowie eine Reihe zusätzlicher Pakete enthält.

Verschiedene Anwendungen können dann unterschiedliche virtuelle Umgebungen nutzen. Um das zuvor genannte Beispiel widersprüchlicher Anforderungen zu lösen, kann Anwendung A über eine eigene virtuelle Umgebung verfügen, in der Version 1.0 installiert ist, während Anwendung B eine andere virtuelle Umgebung mit Version 2.0 nutzt. Wenn für Anwendung B ein Upgrade einer Bibliothek auf Version 3.0 erforderlich ist, hat dies keine Auswirkungen auf die Umgebung von Anwendung A.

12.2. Erstellung virtueller Umgebungen

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.

Um eine virtuelle Umgebung zu erstellen, lege ein Verzeichnis fest, in dem du diese ablegen möchtest, und führe das Modul venv als Skript mit dem Verzeichnispfad aus:

python -m venv tutorial-env

Dadurch wird das Verzeichnis tutorial-env angelegt, falls es noch nicht existiert, und es werden darin Unterverzeichnisse erstellt, die eine Kopie des Python-Interpreters sowie verschiedene Hilfsdateien enthalten.

Ein gängiger Speicherort für eine virtuelle Umgebung ist .venv . Durch diesen Namen bleibt das Verzeichnis in der Regel in deiner Shell verborgen und stört somit nicht, während der Name gleichzeitig verdeutlicht, wozu das Verzeichnis dient. Außerdem wird dadurch eine Kollision mit den Definitionsdateien der Umgebungsvariablen .env vermieden, die von einigen Tools unterstützt werden.

Sobald du eine virtuelle Umgebung erstellt hast, kannst du diese aktivieren.

Führe unter Windows Folgendes aus:

tutorial-env\Scripts\activate.bat

Unter Unix oder macOS führe folgenden Befehl aus:

source tutorial-env/bin/activate

(Dieses Skript wurde für die Bash-Shell geschrieben. Wenn du die Shells csh oder fish verwendest, solltest du stattdessen die alternativen Skripte unter activate.csh und activate.fish verwenden.)

Durch das Aktivieren der virtuellen Umgebung ändert sich die Eingabeaufforderung deiner Shell so, dass angezeigt wird, welche virtuelle Umgebung du gerade verwendest, und die Umgebung wird so angepasst, dass du mit dem Befehl python genau diese Version und Installation von Python aufrufst. Zum Beispiel:

$ 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. Pakete mit pip verwalten

Mit dem Programm pip kannst du Pakete installieren, aktualisieren und entfernen. Standardmäßig installiert pip Pakete aus dem Python Package Index. Du kannst den Python Package Index durchsuchen, indem du die entsprechende Seite in deinem Webbrowser aufrufst.

pip verfügt über eine Reihe von Unterbefehlen: „install“, „uninstall“, „freeze“ usw. (Die vollständige Dokumentation zu pip findest du im Handbuch Installing Python Modules .)

Du kannst die neueste Version eines Pakets installieren, indem du den Namen des Pakets angibst:

(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 kannst auch eine bestimmte Version eines Pakets installieren, indem du den Paketnamen gefolgt von == und der Versionsnummer angibst:

(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

Die requirements.txt kann anschließend in die Versionskontrolle übernommen und als Teil einer Anwendung ausgeliefert werden. Benutzer können dann alle erforderlichen Pakete mit dem Befehl install -r installieren:

(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 Verteilen von Python-Modulen guide.