IT-Service: Python unter Linux nutzen

Schnelleinstieg

Die Programmiersprache Python ist auf allen Linux-Maschinen von GSI/FAIR installiert. Sie kann von allen Personen verwendet werden, die Zugriff auf eine dieser Maschinen haben, was lediglich ein Linux-Konto voraussetzt.

Beim Arbeiten mit Python wird oftmals Code von Drittherstellern, sogenannte Module, benötigt. An der GSI/FAIR wird IT-Sicherheit sehr ernst genommen und daher nicht jeder Code auf Farmmaschinen installiert. Dies Seite stellt Ihnen aber Methoden vor, um die Anforderungen Ihrer Software zu erfüllen.

Service-Beschreibung

Wenn Sie Python-Module auf durch die IT verwalteten Maschinen benötigen, welche nicht bereits installiert sind, gibt es vier Möglichkeiten dies zu beheben. Sehen Sie sich die Sektionen weiter unten für jede einzelne Methode an.

  1. Prüfen, ob ein Debian-Paket für das Modul existiert und es für das aktuelle Debian-Release verfügbar ist.
  2. Das Modul in das eigene Heimatverzeichnis installieren und den Interpreter von Debian nutzen.
  3. Virtuelle Umgebungen nutzen, um die eigenen Module unabhängig von vorinstallierten Modulen zu verwenden.
  4. Eine vollständige Python-Distribution verwenden, um den genutzten Interpreter zusammen mit allen Modulen zu verwalten.

Python-Module haben bei Debian die Namenskonvention python-MODULNAME, z.B. python-sphinx. Generell kann die IT-Abteilung nur Module und Versionen anbieten, welche in den offiziellen Debian-Paketarchiven vorhanden sind. Falls das Modul als Debian-Paket verfügbar ist, können Sie die mögliche Version mit dem Befehl apt-cache policy PAKETNAME herausfinden.

$ apt-cache policy python-sphinx
python-sphinx:
  Installiert: 1.2.3+dfsg-1
  Installationskandidat: 1.2.3+dfsg-1
  Versionstabelle:
 *** 1.2.3+dfsg-1 0
        500 http://mirror.gsi.de/distrib/debian/ jessie/main amd64 Packages
        100 /var/lib/dpkg/status

Die Ausgabe des Befehls gibt an, dass das Debian-Paket python-sphinx in Version 1.2.3+dfsg-1 (Version 1.2.3 des Upstreams) installiert ist. Im folgenden Fall ist das Paket in Version 0.11-1 vorhanden (0.11 des Upstreams), aber nicht installiert.

$ apt-cache policy python-sphinx-issuetracker
python-sphinx-issuetracker:
  Installiert:           (keine)
  Installationskandidat: 0.11-1
  Versionstabelle:
     0.11-1 0
        500 http://mirror.gsi.de/distrib/debian/ jessie/main amd64 Packages

Wenn Sie ein Paket benötigen, welches verfügbar aber nicht installiert ist, schreiben Sie bitte eine E-Mail an linux-service @ gsi.de mit dem Namen das Pakets und den Namen Ihres lokalen Gerätes

Wenn Sie sich dazu entscheiden Bibliotheken in Ihrem Heimatverzeichnis zu installieren, müssen Sie wahrscheinlich den Ladepfad (PATH) von Python anpassen. Dies kann mit der Umgebungsvariable PYTHONPATH erledigt werden. Solange sie nicht gesetzt ist, schaut der Python-Interpreter normalerweise nur in ausgwählte Systemverzeichnisse. Mit folgendem Befehl können Sie sehen, welche es sind:

$ python -c "import sys; print sys.path"
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu',
  '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old',
  '/usr/lib/python2.7/lib-dynload', 'HEIMATVERZEICHNIS/.local/lib/python2.7/site-packages',
  '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0',
  '/usr/lib/pymodules/python2.7']

Wenn Sie Module nach bspw. ~/mypythonmodules installieren und sie im Ladepfad stehen haben möchten, können Sie folgendes tun:

$ PYTHONPATH=~/mypythonmodules python -c "import sys; print sys.path"
['', 'HEIMATVERZEICHNIS/mypythonmodules', '/usr/lib/python2.7',
  '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',
  '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',
  'HEIMATVERZEICHNIS/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL',
  '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7']

Um nicht vor jedem Befehl PYTHONPATH setzen zu müssen, können Sie den Wert auch für die aktuelle Shell mit export PYTHONPATH=~/mypythonmodules oder für jede neue Shell, indem Sie diese Zeile an Ihre ~/.profile oder ~/.bashrc anhängen, setzen.

Wenn Sie Module in Ihrem Heimatverzeichnis installieren und vergessen PYTHONPATH zu setzen, werden Sie wahrscheinlich die Fehlermeldung ImportError: No module namend mymodule erhalten.

Installieren mit pip

Der standardmäßige Befehl zum Installieren eines Moduls mit pip ist pip install MODULNAME. Dies wird aber wahrscheinlich fehlschlagen, da pip ohne Optionen versucht mit Systemverzeichnissen zu arbeiten. Mit dem Schalter --user nutzt pip stattdessen das Verzeichnis ~/.local/lib/pythonX.X/site-packages, welches bereits in Ihrem PYTHONPATH enthalten ist. Das Verzeichnis kann mit der Option --install-option=--prefix=VERZEICHNIS oder nur --prefix VERZEICHNIS mit neueren Versionen angepasst werden.

$ pip install --prefix=~/python sphinxcontrib-bibtex
Downloading/unpacking sphinxcontrib-bibtex
  Downloading sphinxcontrib-bibtex-0.3.4.tar.gz (50Kb): 50Kb downloaded
  Running setup.py egg_info for package sphinxcontrib-bibtex

...skipped output ...

Requirement already satisfied (use --upgrade to upgrade): PyYAML >=3.01 in /usr/lib/python2.7/dist-packages (from pybtex>=0.17->sphinxcontrib-bibtex)

...skipped output ...

    Skipping installation of HEIMATVERZEICHNIS/python/lib/python2.7/site-packages/sphinxcontrib/__init__.py (namespace package)

...skipped output ...

Successfully installed sphinxcontrib-bibtex latexcodec pybtex pybtex-docutils six oset
Cleaning up...

Dieses Beispiel demonstiert einige Punkte:

  • pip lädt das Modul herunter und prüft es auf Abhängigkeiten
  • Wenn pip feststellt, dass einige Abhängigkeiten bereits installiert sind (in diesem Beispiel PyYAML), wird die Installation übersprungen
  • pip installiert keine __init__.py for sogenannte Namespace-Pakete. Dies führt dazu, dass import sphinxcontrib.bibtex fehlschlägt, da sphinxcontrib keine __init__.py enthält und damit nicht als Modul erkannt wird
  • Die Module werden in ~/python/lib/python2.7/site-packages installiert, weshalb dieses Verzeichnis in Ihrem PYTHONPATH stehen sollte

Nach der Installation müssen Sie noch folgende Schritte erledigen:

  • PYTHONPATH setzen
  • Eine leere __init__.py für alle Namespace-Pakete anlegen.
  • Optional: Wenn die Module auch Skripte nach ~/python/bin installieren, können Sie Ihren PATH anpassen
$ export PYTHONPATH=~/python/lib/python2.7/site-packages
$ touch $PYTHONPATH/sphinxcontrib/__init__.py
$ # Optional: PYTHONPATH in .bashrc setzen
$ echo 'export PYTHONPATH=~/python/lib/python2.7/site-packages' >>~/.bashrc
$ # Optional: PATH setzen
$ export PATH=~/python/bin:$PATH

Virtuelle Umgebungen können genutzt werden, um Python-Projekte von anderen zu isolieren. Dadurch kann jedes Projekt seine eigenen Abhängigkeiten besitzen.

Auf allen GSI-Linux-Desktops ist das Programm virtualenv für Python 2 und 3 verfügbar. Die folgenden Pakete sollten auf Ihrem Gerät installiert sein:

  • python-virtualenv
  • python3-virtualenv
  • virtualenv

Die folgenden Befehle können genutzt werden, um ein Modul (NAME) in einer virtuellen Umgebung zu installieren.

  1. Umgebungsverzeichnis anlegen: mkdir /data.local1/NAME
  2. Umgebung anlegen: virtualenv --system-site-packages /data.local1/NAME
  3. Umgebung aktivieren: source /data.local1/NAME/bin/activate (for Bash or Zsh)
    Der Befehl muss jedes Mal ausgeführt werden, wenn Sie die Umgebung nutzen möchten. Er sollte den Prompt Ihrer Kommandozeile zu etwas wie (NAME)$ verändert haben.
  4. Modul installieren: pip install --upgrade NAME
    Dies kann eine Zeit dauern, da pip alle Abhängigkeiten herunterladen und ggf. kompilieren muss.
  5. Umgebung verlassen: deactivate

Referenzen (englisch)

Falls es nicht möglich ist eine Version eines Modules zu installieren, weil der vorhandene Python-Interpreter zu alt ist, bleibt Ihnen nur die Möglichkeit eine Python-Distribution wie Anaconda zu nutzen. Sie stellt ein Archiv mit den neuesten Python-Interpretern (3.x und 2.x), verschiedenen Modulen und einen Paketmanager namens Conda bereit. Wir empfehlen aber die reduzierte Version von Anaconda Miniconda, die nur den Python-Interpreter und den Conda-Paketmanager beinhaltet.

Miniconda installieren

Sie können die folgenden Schritte befolgen, um Miniconda mit Python 3.7 zu installieren und damit Ihre virtuelle Umgebung zu erstellen.

  1. Laden Sie Miniconda-Installer (für Linux) hier herunter.
  2. Starten Sie den Installer in Ihrem Terminal (bash Miniconda3-latest-Linux-x86_64.sh) und akzeptieren Sie die Lizenzbestimmungen
  3. Standardmäßig wird Miniconda unter $HOME/miniconda3 installiert, aber Sie können einen anderen Pfad wählen, z.B. /data.local, wenn dieser auf Ihrem Gerät verfügbar ist.
    Falls möglich vermeiden Sie es Conda und zugehörige Module unter Ihrem Lustre-Verzeichnis zu installieren. Abhängig von den benötigten Modulen, wird die Installation in hunderte, manchmal tausende, kleine Dateien aufgeteilt. Dies hat schwere Auswirkungen auf die Leistung von Lustre für alle Benutzer*innen.
  4. Der Installer wird danach weitere Pakete installieren. Er wird Sie fragen, ob Sie Ihre Umgebung initialisieren möchten. Wenn Sie dem zustimmen, werden folgende Zeilen an das Ende Ihrer .bashrc gehangen:
    # >>> conda initialize >>>
    # !! Contents within this block are managed by 'conda init' !!
    __conda_setup="$('/home/myuser/miniconda3/bin/conda' 'shell.bash' 'hook' 2>/dev/null)"
    if [ $? -eq 0 ]; then
      eval "$__conda_setup"
    else
      if [ -f "/home/myuser/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/myuser/miniconda3/etc/profile.d/conda.sh"
      else
        export PATH="/home/myuser/miniconda3/bin:$PATH"
      fi
    fi
    unset __conda_setup
    # <<< conda initialize <<<
  5. Um die Änderungen anzuwenden ist es besser, dass Sie Ihr Terminal schließen und ein neues öffnen. Ein einfacher Test ist es den Conda-Paketmanager auf der Kommandozeile des neuen Terminals zu starten (die Version ist bei Ihnen vielleicht anders):
    :~$ conda --version
    conda 4.7.12

Python-Module installieren

  • Alle installierten Pakete in der aktuellen, virtuellen Umgebung auflisten: conda list
  • Module installieren und entfernen: conda install MODULNAME, conda uninstall MODULNAME
  • Module aktualisieren und nach Modulen suchen: conda update MODULNAME, conda search MODULNAME

Umgebungen mit Conda nutzen

Standardmäßig erstellt Miniconda beim Installieren automatisch eine Python-Umgebung namens base, welche Sie im Prompt Ihrer Kommandozeile sehen sollten, wenn Sie sie nicht selbst umgestaltet haben. Um Ihre Miniconda-Umgebung nicht zu belasten, können Sie mit folgenden Befehlen eine seperate erstellen. Statt mytest können Sie natürlich jeden anderen Namen verwenden. Die angezeigten Versionen werden wahrscheinlich von denen abweichen, die Ihre Version von Conda ausgibt.

:~$ conda create --name mytest python=3.7
[...]
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/myuser/miniconda3/envs/mytest

  added / updated specs:
    - python=3.7

The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    ca-certificates-2019.11.27 |                0         124 KB
    certifi-2019.11.28         |           py37_0         153 KB
    ld_impl_linux-64-2.33.1    |       h53a641e_7         568 KB
    openssl-1.1.1d             |       h7b6447c_3         2.5 MB
    pip-19.3.1                 |           py37_0         1.6 MB
    python-3.7.6               |       h0371630_2        44.9 MB
    setuptools-44.0.0          |           py37_0         520 KB
    sqlite-3.30.1              |       h7b6447c_0         1.1 MB
    wheel-0.33.6               |           py37_0          42 KB
    ------------------------------------------------------------
                                           Total:        51.4 MB
                                   
The following NEW packages will be INSTALLED:
                             
  _libgcc_mutex      pkgs/main/linux-64::_libgcc_mutex-0.1-main
  ca-certificates    pkgs/main/linux-64::ca-certificates-2019.11.27-0
  certifi            pkgs/main/linux-64::certifi-2019.11.28-py37_0
  ld_impl_linux-64   pkgs/main/linux-64::ld_impl_linux-64-2.33.1-h53a641e_7
  libedit            pkgs/main/linux-64::libedit-3.1.20181209-hc058e9b_0
  libffi             pkgs/main/linux-64::libffi-3.2.1-hd88cf55_4
  libgcc-ng          pkgs/main/linux-64::libgcc-ng-9.1.0-hdf63c60_0
  libstdcxx-ng       pkgs/main/linux-64::libstdcxx-ng-9.1.0-hdf63c60_0
  ncurses            pkgs/main/linux-64::ncurses-6.1-he6710b0_1
  openssl            pkgs/main/linux-64::openssl-1.1.1d-h7b6447c_3
  pip                pkgs/main/linux-64::pip-19.3.1-py37_0
  python             pkgs/main/linux-64::python-3.7.6-h0371630_2
  readline           pkgs/main/linux-64::readline-7.0-h7b6447c_5
  setuptools         pkgs/main/linux-64::setuptools-44.0.0-py37_0
  sqlite             pkgs/main/linux-64::sqlite-3.30.1-h7b6447c_0
  tk                 pkgs/main/linux-64::tk-8.6.8-hbc83047_0
  wheel              pkgs/main/linux-64::wheel-0.33.6-py37_0
  xz                 pkgs/main/linux-64::xz-5.2.4-h14c3975_4
  zlib               pkgs/main/linux-64::zlib-1.2.11-h7b6447c_3

Proceed ([y]/n)? y

Downloading and Extracting Packages
[...]

Die neue Umgebung ist nun installiert, aber noch nicht aktiviert. Es stehen folgende Befehle zur Verfügung:

  • Eine Umgebung aktivieren: conda activate mytest.
  • Deaktivierung und Rückkehr zur base-Umgebung: conda deactivate
  • Eine Umgebung und alle zugehörigen, installierten Module entfernen:
    conda remove --name mytest --all
  • Die Installation und Entfernung von Modulen kann mit denselben Conda-Befehlen wie oben beschrieben erfolgen. Sie werden aber innerhalb der Umgebung ausgeführt.

Referenzen (englisch)

Verfügbarkeit und Support


Loading...