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.
- Prüfen, ob ein Debian-Paket für das Modul existiert und es für das aktuelle Debian-Release verfügbar ist.
- Das Modul in das eigene Heimatverzeichnis installieren und den Interpreter von Debian nutzen.
- Virtuelle Umgebungen nutzen, um die eigenen Module unabhängig von vorinstallierten Modulen zu verwenden.
- 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, dassimport sphinxcontrib.bibtex
fehlschlägt, dasphinxcontrib
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.
- Umgebungsverzeichnis anlegen:
mkdir /data.local1/NAME
- Umgebung anlegen:
virtualenv --system-site-packages /data.local1/NAME
- 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. - Modul installieren:
pip install --upgrade NAME
Dies kann eine Zeit dauern, da pip alle Abhängigkeiten herunterladen und ggf. kompilieren muss. - 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.
- Laden Sie Miniconda-Installer (für Linux) hier herunter.
- Starten Sie den Installer in Ihrem Terminal (
bash Miniconda3-latest-Linux-x86_64.sh
) und akzeptieren Sie die Lizenzbestimmungen - 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. - 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 <<<
- 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
- Support-Email: linux-service @ gsi.de