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.
