Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Was fehlt?

Es liegt in der Natur der Sache: Ein Wiki ist niemals fertig. Wir geben uns große Mühe, mit der Entwicklung Schritt zu halten; lassen Supportanfragen direkt in neue Artikel einfließen … aber auch wir sind nicht perfekt. Wenn du hier nicht fündig wirst: Nicht schmollen - Bescheid sagen! Unter hallo@uberspace.de steht dir unser Team gerne bereit. Hand drauf!

development:python
Alle Anleitungen in diesem Wiki beziehen sich auf Uberspace 6. Die Dokumentation für U7 findest du im neuen Manual.

Python

Auf unseren Servern stellen wir dir die Programmiersprache Python bereit und bieten dir hier sowohl die aktuellsten Releases 3.6 und 2.7 als auch eine Reihe älterer Versionen sowie die Python-Versionen der von uns eingesetzten Linux-Distribution CentOS. Für neue Projekte solltest du Python 3.6 verwenden; Python 2.7 ist allerdings auch noch sehr verbreitet und wird von vielen Applikationen eingesetzt, die noch nicht auf Python 3 portiert worden sind.

Befindest du dich noch auf einem Host mit CentOS 5, so solltest du dir einen frischen Uberspace klicken, der dann auf einem Host mit CentOS 6 liegen wird. Python 3.6 ist nicht mehr mit der OpenSSL-Version von CentOS 5 kompatibel.

Version 3.6

Bitte benutze python3.6, um Scripts mit Python 3.6 auszuführen. Als Shebang-Zeile am Scriptanfang verwende bitte #!/usr/bin/env python3.6, so dass deine Scripts portabel zwischen verschiedenen Systemen austauschbar sind, auf denen Python in unterschiedlichen Pfaden installiert wurde.

Python-Module kannst du hier mit pip3.6 installieren. Bitte beachte, dass du hier bei das --user-Flag angeben musst, damit die Module in deinem Home-Verzeichnis installiert werden:

 [julia@amnesia ~]$ pip3.6 install <paketname> --user

Es empfiehlt sich jedoch, für jedes Python-Projekt eine virtuelle Umgebung anzulegen, in dem die Module speziell für dieses Projekt verwaltet werden. Unter Python 3.6 ist das venv-Modul das Standard-Tool für diese Aufgabe. In diesem Beispiel wird ein Projektverzeichnis MyProject angelegt; innerhalb jenes Verzeichnisses wird eine virtuelle Umgebung namens venv angelegt:

 [julia@amnesia ~]$ mkdir MyProject
 [julia@amnesia ~]$ cd MyProject
 [julia@amnesia MyProject]$ python3.6 -m venv venv
 [julia@amnesia MyProject]$ source venv/bin/activate
 (MyProject) [julia@amnesia MyProject]$

Am geänderten Prompt erkennst du, dass du dich gerade in einer virtuellen Umgebung befindest. Sie ist vollständig von deinen anderen Python-Projekten abgekapselt. Innerhalb der virtuellen Umgebung kannst du alle Befehle ohne Versionsangabe verwenden (also python, pip etc. statt python3.6, pip3.6 etc.) und benötigst bei Installationen mit pip auch kein --user-Flag, da du die Installation hier - innerhalb der virtuellen Umgebung - sozusagen „global“ durchführst. Du kannst also einfach ausführen:

 (MyProject) [julia@amnesia MyProject]$ pip install <paketname>

Zum Verlassen der virtuellen Umgebung verwende bitte den Befehl deactivate; du siehst, dass das Prompt damit zurückgesetzt wird:

 (MyProject) [julia@amnesia MyProject]$ deactivate
 [julia@amnesia MyProject]$ 

Mehr Informationen findest du im Kapitel zu venv im Python-Handbuch.

Version 2.7

Bitte benutze python2.7, um Scripts mit Python 2.7 auszuführen. Als Shebang-Zeile am Scriptanfang verwende bitte #!/usr/bin/env python2.7, so dass deine Scripts portabel zwischen verschiedenen Systemen austauschbar sind, auf denen Python in unterschiedlichen Pfaden installiert wurde.

Python-Module kannst du hier mit pip2.7 installieren. Bitte beachte, dass du hier bei das --user-Flag angeben musst, damit die Module in deinem Home-Verzeichnis installiert werden:

 [julia@amnesia ~]$ pip2.7 install <paketname> --user

Es empfiehlt sich jedoch, für jedes Python-Projekt eine virtuelle Umgebung anzulegen, in dem die Module speziell für dieses Projekt verwaltet werden. Unter Python 2.7 ist virtualenv das Standard-Tool für diese Aufgabe. In diesem Beispiel wird ein Projektverzeichnis MyProject angelegt; innerhalb jenes Verzeichnisses wird eine virtuelle Umgebung namens venv angelegt:

 [julia@amnesia ~]$ mkdir MyProject
 [julia@amnesia ~]$ cd MyProject
 [julia@amnesia MyProject]$ virtualenv venv
 New python executable in /home/julia/MyProject/venv/bin/python2.7
 Also creating executable in /home/julia/MyProject/venv/bin/python
 Installing setuptools, pip, wheel...done.
 [julia@amnesia MyProject]$ source venv/bin/activate
 (MyProject) [julia@amnesia MyProject]$

Am geänderten Prompt erkennst du, dass du dich gerade in einer virtuellen Umgebung befindest. Sie ist vollständig von deinen anderen Python-Projekten abgekapselt. Innerhalb der virtuellen Umgebung kannst du alle Befehle ohne Versionsangabe verwenden (also python, pip etc. statt python2.7, pip2.7 etc.) und benötigst bei Installationen mit pip auch kein --user-Flag, da du die Installation hier - innerhalb der virtuellen Umgebung - sozusagen „global“ durchführst. Du kannst also einfach ausführen:

 (MyProject) [julia@amnesia MyProject]$ pip install <paketname>

Zum Verlassen der virtuellen Umgebung verwende bitte den Befehl deactivate; du siehst, dass das Prompt damit zurückgesetzt wird:

 (MyProject) [julia@amnesia MyProject]$ deactivate
 [julia@amnesia MyProject]$ 

Mehr Informationen findest du auf der virtualenv-Website.

Ältere Versionen

Bist du aus irgendwelchen Gründen noch auf Python 3.5 oder 3.4 angewiesen, kannst du entsprechend python3.5 bzw. python3.4 verwenden und Pakete mit pip3.5 bzw. pip3.4 installieren. Virtuelle Umgebungen kannst du mit python3.5 -m venv … bzw. python3.4 -m venv … anlegen.

Mit dem Befehl python (ohne Versionsangabe) kannst du den Python-Interpreter der Distribution (Python 2.6 bei CentOS 6, Python 2.4 bei CentOS 5) ausführen. Dieser Interpreter ist jedoch sehr betagt. Du solltest wissen, was du tust, wenn du auf diesen Interpreter zurückgreifen willst.

Probleme

MarkupSafe

Der Installer von MarkupSafe legt offenbar seine Dateien in einem falschen Verzeichnis ab. Um das zu korrigieren, ist Handarbeit notwendig:

$ mv ~/lib/python2.7/home/$USER/lib/python2.7/markupsafe ~/lib/python2.7/
$ rm -r ~/lib/python2.7/home

PIL

Die Python Imaging Library, kurz „PIL“, ist eine beliebte Python-Bibliothek zur Bildverarbeitung. Eine Frage auf StackOverflow weist jedoch auf Probleme hin:

The PIL version packaged on pypi (by the author) is fundamentally mis-packaged. People have created easy_installable versions elsewhere. Currently, you need to specify a find-links URL and pin the version to get a good package:

easy_install -f http://dist.plone.org/thirdparty/ -U PIL==1.1.7

Konkret sieht es so aus, dass das PIL, das man über pypi.python.org beziehen kann, seine Module nicht im Namensraum „PIL“ installiert. Das heißt, man kann beispielsweise das Module „Image“ mit import Image benutzen, was wohl auch so beabsichtigt ist, wie das Tutorial zu PIL beschreibt. Allerdings haben fast alle Distributionen die PIL-Module in den Namensraum „PIL“ gepackt, so dass Anweisungen wie import PIL oder from PIL import Image benutzt werden müssen - was sich als die verbreitetere Form etabliert hat. Insofern kann das defaultmäßig mittels easy_install installierbare PIL gelinde gesagt als unbrauchbar angesehen werden.

Nun kommt aber auch noch dazu, dass PIL selbst (egal, wer dafür ein Egg paketiert hat) erschreckend unvorbereitet darauf ist, dass es auf 64-Bit-Architektur installiert werden könnte. Soll heißen: Es sucht die entsprechenden Libraries (jpeg, zlib, freetype, …) in /usr/lib und /usr/local/lib - nicht aber dort, wo sie auf einem 64-Bit-System liegen, nämlich in /usr/lib64. Die PIL-Pakete verschiedener Linux-Distributionen liefern dementsprechend schon seit Jahren Patches mit, um PIL das beizubringen - PIL selbst kann es bis heute nicht.

Faktisch muss daher die setup.py angepasst werden, damit PIL die Libraries findet. PIL kann daher nicht mit easy_install installiert werden. Du kannst wie folgt vorgehen (wir gehen mal davon aus, du benutzt Python 2.7 und hast, wie oben beschrieben, bereits mkdir -p ~/bin ~/lib/python2.7 durchgeführt):

[simone@fornax ~]$ curl --silent http://effbot.org/media/downloads/Imaging-1.1.7.tar.gz | tar -xzf -
[simone@fornax ~]$ cd Imaging-1.1.7 
[simone@fornax Imaging-1.1.7]$ perl -pi -e 's|/usr/lib|/usr/lib64|g' setup.py
[simone@fornax Imaging-1.1.7]$ python2.7 setup.py install --user
...
creating /home/simone/lib/python2.7/PIL.pth
[simone@fornax Imaging-1.1.7]$ cd ..
[simone@fornax ~]$ rm -rf Imaging-1.1.7

Das war's. Kurz testen, ob's geklappt hat:

[simone@fornax ~]$ python2.7 
Python 2.7.1 (r271:86832, Mar 14 2011, 23:31:42) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image
>>>

Wenn hier kein Fehler gemeldet wird, ist alles gut - ansonsten frag einfach beim Support nach Unterstützung.

SQlite

Wenn du eine neuere Version von SQLite benutzen möchtest, musst du ggf. die LD_LIBRARY-Variable anpassen. Gehen wir mal davon aus, dass du das SQLite unter /package/host/localhost/sqlite-3.7.15.2 benutzen möchtest (Achtung, die Pakete unter /package/host/localhost variieren von Host zu Host, schaue lieber vorher nach). Dann kannst du einfach folgenden Befehl ausführen, um den Pfad bei jedem Login zu setzen:

echo "export LD_LIBRARY_PATH=/package/host/localhost/sqlite-3.7.15.2/lib:$LD_LIBRARY_PATH" >> .bash_profile 

Wenn die Installation dann doch noch nicht klappen sollte, kannst du noch weitere Umgebungsvariablen anpassen.

development/python.txt · Zuletzt geändert: 2017/05/11 10:47 von uber