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. Bitte schauen Sie aber auch, ob eine der folgenden Methoden für Sie möglich ist. Häufig ist es vorteilhaft eine vom Betriebssystem unabhängige Umgebung für Python zu nutzen.

Installieren mit pip

Mit pip ohne Optionen werden Pakete in Systemverzeichnissen verwaltet, was root-Rechte benötigt. Mit dem Schalter --user nutzt pip stattdessen das Verzeichnis ~/.local/lib/pythonX.X/site-packages (X.X ist die Version des Python-Interpreters), welches bereits in Ihrem PYTHONPATH enthalten ist und damit automatisch eingebunden wird.

$ pip3 install --user pyserial
Collecting pyserial
  Downloading https://files.pythonhosted.org/packages/...
Installing collected packages: pyserial
Successfully installed pyserial-3.5
$ python3
>>> import serial

Das Verzeichnis kann mit der Option --prefix VERZEICHNIS (mit alten Python-Versionen --install-option=--prefix=VERZEICHNIS) angepasst werden. Damit es genutzt wird, muss PYTHONPATH der Pfad VERZEICHNIS/lib/pythonX.X/site-packages hinzugefügt werden. Um Befehle auszuführen kann darüber hinaus PATH um VERZEICHNIS/bin (~/.local/bin für --user) erweitert werden.

$ pip3 install --prefix=~/python sphinxcontrib-bibtex
Collecting sphinxcontrib-bibtex
  Downloading https://files.pythonhosted.org/packages/...
Collecting pybtex-docutils>=1.0.0 (from sphinxcontrib-bibtex)
  Downloading https://files.pythonhosted.org/packages/...
... weitere Downloads ...

Requirement already satisfied: docutils>=0.8 in /usr/lib/python3/dist-packages (from sphinxcontrib-bibtex) (0.14)
Requirement already satisfied: PyYAML>=3.01 in /usr/lib/python3/dist-packages (from pybtex>=0.24->sphinxcontrib-bibtex) (3.13)
... weitere, erfüllte Abhängigkeiten ...

Installing collected packages: latexcodec, pybtex, pybtex-docutils, zipp, typing-extensions, ...
  The scripts pybtex, pybtex-convert and pybtex-format are installed in '/home/user/python/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  ... weitere Warnmeldungen wegen PATH ...

Successfully installed Sphinx-5.0.2 charset-normalizer-2.1.0 ...

$ export PYTHONPATH=~/python/lib/python3.7/site-packages:$PYTHONPATH
$ python3
>>> import sphinxcontrib.bibtex
$ export PATH=~/python/bin:$PATH
$ pybtex --help
...

PATH und PYTHONPATH können permanent gesetzt werden, indem die export-Befehle z.B. ~/.profile oder ~/.bashrc angehangen werden.

Installieren ohne pip

Module können auch händisch verwaltet werden. Das ist z.B. bei selbst entwickelten Modulen praktisch. Hierfür muss nur ein Ordner angelegt und dort die Module abgelegt werden. Wenn ein anderes Verzeichnis, als ~/.local/lib/pythonX.X/site-packages genutzt wird, muss der Pfad zu PYTHONPATH hinzugefügt werden. X.X ist dabei die Version des Python-Interpreters (python --version) ohne Patch-Level (letzte Zahl).

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

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...