Erfahren Sie, wie Sie häufige Python-Probleme beheben können.

An­for­de­run­gen

  • Python in­stal­liert und läuft
  • Linux-Server
Dedicated Server
De­di­zier­te Server mit mo­derns­ten Pro­zes­so­ren
  • 100 % En­ter­pri­se-Hardware
  • Kon­fi­gu­rier­ba­re Hardware-Aus­stat­tung
  • ISO-zer­ti­fi­zier­te Re­chen­zen­tren

Ein einfaches Skript zum Testen von Python

Für Test­zwe­cke ist es am besten, die Dinge einfach zu halten. Verwenden Sie dieses Skript, um Python entweder von der Be­fehls­zei­le oder in einem Browser zu testen:

#!/usr/bin/python
print "Content-Type: text/html"
print "\n\n"
print "<p>Hello World</p>"

Speichern Sie dieses Skript in einer Datei namens hel­lo­world.py.

Beginnen Sie mit der Feh­ler­be­he­bung, indem Sie Ihr Skript über die Be­fehls­zei­le testen:

sudo python helloworld.py

Die Ausgabe sollte so aussehen:

De­ko­die­rung eines Python-Fehlers

Wenn Python ein Problem mit dem Skript findet, versucht es am besten, Ihnen mit­zu­tei­len, was das Problem ist und wo es sich befindet.

Hier ist ein Beispiel für einen Fehler, der durch das Entfernen des Dop­pel­punk­tes : am Ende einer for-Anweisung ver­ur­sacht wurde:

Diese Feh­ler­mel­dung besteht aus drei Elementen:

  • Die Zeile des Codes, in dem der Fehler auftritt (Zeile 3 in diesem Beispiel).
  • Ein ^-Zeiger, der die genaue Position des Fehlers her­aus­fin­det (nach den besten Fä­hig­kei­ten von Python).
  • Die Feh­ler­mel­dung selbst ("Syn­taxEr­ror: invalid syntax").

In diesem Beispiel hat Python das Problem genau iden­ti­fi­ziert. Es gibt einige Si­tua­tio­nen - ins­be­son­de­re wenn ein An­füh­rungs­zei­chen oder eine End­klam­mer fehlt - in denen Python nicht in der Lage ist, die Position des Fehlers so leicht zu erraten. Wenn Sie diese Fehler lesen, denken Sie daran, dass das Problem an oder vor dem Ort auftreten könnte, den Python iden­ti­fi­ziert.

Per­mis­si­on Denied

Wenn Sie beim Versuch, dieses Python-Skript von der Be­fehls­zei­le aus aus­zu­füh­ren, einen Fehler "per­mis­si­on denied" erhalten, sind die Be­rech­ti­gun­gen höchst­wahr­schein­lich falsch.

Die Lösung für dieses Problem hängt davon ab, wie Sie das Skript aufrufen.

Be­rech­ti­gung ver­wei­gert beim Ausführen eines Skripts mit dem Python-Befehl

Im Gegensatz zu einem CGI-Skript müssen Python-Skripte keine Aus­füh­rungs­rech­te haben, um aus­ge­führt zu werden, wenn Sie sie mit dem Befehl python aufrufen. Python ist eine in­ter­pre­tier­te Sprache, was bedeutet, dass, wenn Sie die Datei mit python[filename] aufrufen, Python selbst die Aus­füh­rung übernimmt. Die Datei muss nur von Python lesbar sein.

Um dies ein­zu­stel­len, verwenden Sie den Befehl:

sudo chmod 644 helloworld.py

Um die Be­rech­ti­gun­gen zu über­prü­fen, listen Sie die Dateien im Ver­zeich­nis mit dem Befehl auf:

sudo ls -la

In diesem Beispiel sehen Sie, dass die Datei hel­lo­world.py Lese-/Schreib­rech­te für den Ei­gen­tü­mer und Le­se­rech­te für Gruppe und Welt hat (chmod 644):

Sie können dieses Test­skript mit dem Befehl ausführen:

sudo python helloworld.py

Be­rech­ti­gung ver­wei­gert beim Ausführen eines Skripts von der Shell aus

Die andere Mög­lich­keit, ein Python-Skript aus­zu­füh­ren, besteht darin, es direkt aus der Shell auf­zu­ru­fen:

./helloworld.py

Aufgrund der Art und Weise, wie die Shell diesen Befehl in­ter­pre­tiert, muss die Datei aus­führ­bar sein. Um die Be­rech­ti­gun­gen zu kor­ri­gie­ren, verwenden Sie den Befehl:

sudo chmod 755 helloworld.py

Um die Be­rech­ti­gun­gen zu über­prü­fen, listen Sie die Dateien im Ver­zeich­nis mit dem Befehl auf:

sudo ls -la

In diesem Beispiel sehen Sie, dass die Datei hel­lo­world.py über Lese-/Schreib-/Aus­füh­rungs­rech­te für den Ei­gen­tü­mer und Lese-/Schreib­rech­te für Gruppe und Welt verfügt (chmod 755):

Sie können dieses Test­skript mit dem Befehl ausführen:

./helloworld.py

Bad in­ter­pre­ter: Keine solche Datei oder Ver­zeich­nis

Es gibt eine zweite Mög­lich­keit, ein Python-Skript direkt aus der Shell auf der Kom­man­do­zei­le auf­zu­ru­fen: Der Pfad zu Python muss korrekt sein. An­dern­falls erhalten Sie einen "Bad in­ter­pre­ter": Keine solche Datei oder Ver­zeich­nis" Fehler.

Sie können den Pfad zu Python von der Be­fehls­zei­le aus mit dem Befehl finden:

which python

Nor­ma­ler­wei­se ist der Pfad zu Python /usr/bin/python, aber dies kann je nach In­stal­la­ti­on oder Be­triebs­sys­tem variieren.

Die erste Zeile des Skripts ist #!, gefolgt vom Pfad zu Python auf Ihrem System. Wenn der Pfad zu Python bei­spiels­wei­se /usr/bin/python lautet, muss die erste Zeile des Skripts gelesen werden:

#!/usr/bin/python
Domain-Check

Einzug Feh­ler­mel­dung

Python ist emp­find­lich gegenüber Leer­zei­chen (Leer­zei­chen am Anfang einer Zeile). Jede Zeile muss korrekt ein­ge­rückt sein, denn so "liest" Python ver­schach­tel­te Code­blö­cke. Diese Fehler können auch auftreten, wenn Sie Ta­bu­la­tor­stopps mit Leer­zei­chen mischen.

Es gibt drei damit zu­sam­men­hän­gen­de Fehler:

  • un­er­war­te­ter Einzug: Es gibt ein oder mehrere Leer­zei­chen am Anfang einer Zeile, die nicht vorhanden sein sollten.
  • unindent ent­spricht keiner äußeren Ein­rü­ckungs­ebe­ne: Es gibt weniger Leer­zei­chen am Anfang der Zeile, als es sein sollte.
  • einen ein­ge­rück­ten Block erwartet: Ein Codeblock sollte am Anfang jeder Zeile Leer­zei­chen haben, aber das tut er nicht.

Wenn Sie bei­spiels­wei­se ein Skript von einer Webseite kopieren und einfügen, werden Sie manchmal ver­se­hent­lich am Anfang jeder Zeile in Leer­zei­chen eingefügt.

Dieser White­space muss gelöscht werden, bevor das Skript korrekt aus­ge­führt wird.

Die Python-Feh­ler­mel­dung wird Ihnen oft genau sagen, wo sich der zu­sätz­li­che White­space befindet. In diesem Beispiel gibt die Feh­ler­mel­dung an, dass das Problem in Zeile 4 der Datei liegt:

Wenn wir die Datei öffnen, werden wir sehen, dass dies der Fall ist:

Das Entfernen der zu­sätz­li­chen Leer­zei­chen am Anfang von Zeile 4 er­mög­licht es, dass dieses Skript korrekt aus­ge­führt wird.

TypeError Feh­ler­mel­dun­gen

"TypeError"-Meldungen bedeuten, dass Sie eine Art von Daten so behandeln, als wären es eine andere Art von Daten.

Beim Iterieren über mehrere Elemente hinweg

Eine Mög­lich­keit, wie dies geschieht, ist, wenn Sie versuchen, über jedes Element in einer Liste oder Zei­chen­ket­te zu iterieren. Es gibt eine Reihe von Va­ria­tio­nen zu diesem Fehler, ein­schließ­lich:

"TypeError: range() integer end argument erwartet, got list."

Ein Beispiel für Code, der diesen Fehler ver­ur­sacht:

pet = ['Dog', 'Cat', 'Guinea Pig']
for i in range(pet):
    print (pet[i])

"TypeError: Lis­ten­in­di­zes müssen ganze Zahlen sein, nicht str".

Ein Beispiel für Code, der diesen Fehler ver­ur­sacht:

pet = ['Dog', 'Cat', 'Guinea Pig']
for i in pet:
    print (pet[i])

Behebung von Ite­ra­ti­ons­pro­ble­men

Hier ist der ein­fachs­te Weg, dies richtig zu tun:

pet = ['Dog', 'Cat', 'Guinea Pig']
for i in pet:
    print i

Beim Umgang mit Daten

Eine weitere Quelle von "TypeError"-Meldungen ist die Be­hand­lung von Nicht-Zei­chen­ket­ten­da­ten als Zei­chen­ket­te.

"TypeError: kann keine 'str' und 'int' Objekte verketten".

Ein Beispiel für Code, der diesen Fehler ver­ur­sacht:

widgetCount = 2
print 'I would like ' + widgetCount + ' widgets.'

Es gibt zwei Mög­lich­kei­ten, dieses Problem zu beheben:

1. Ändern des Datentyps

Wenn Sie den Wert in An­füh­rungs­zei­chen setzen, wird Python an­ge­wie­sen, ihn wie eine Zei­chen­ket­te zu behandeln:

widgetCount = '2'
print 'I would like ' + widgetCount + ' widgets.'

2. Aufruf der Daten als Ganzzahl

Al­ter­na­tiv können Sie catCount als Ganzzahl aufrufen, indem Sie Kommas anstelle von + Plus­zei­chen verwenden:

widgetCount = 2
print 'I would like ', widgetCount, ' widgets.'

3. Verketten Sie die Daten korrekt.

Wenn Sie Zei­chen­ket­ten und ganze Zahlen zu einer Zei­chen­ket­te zu­sam­men­fü­gen müssen, ist eine korrekte Methode, die ganzen Zahlen zuerst in das Zei­chen­ket­ten­for­mat zu kon­ver­tie­ren:

widgetCount = 2
first = 'I would like '
last = ' widgets.'
request = first + str(widgetCount) + last
print request

Syn­taxEr­ror-Meldungen

Eine "Syn­taxEr­ror"-Meldung bedeutet, dass in Ihrem Code ein Tipp­feh­ler vorliegt. Einige häufige Aus­las­sun­gen und Fehler sind:

  • Ein einzelnes = verwenden, wenn du == gemeint hast.
  • Vergessen, ein : am Ende einer Anweisung wie for, while, if, if, etc. zu setzen.
  • Eine fehlende ] oder ) Klammer.
  • Verwenden Sie ein Semikolon, wenn Sie ein Dop­pel­punkt gemeint haben.
  • Ver­se­hent­li­ches Ersetzen einer Klammer (Klammer oder [ eckige Klammer durch eine ge­schweif­te Klammer).
  • Recht­schreib­feh­ler wie z.B. fro statt for.
  • Das Weglassen eines ' An­füh­rungs­zei­chens beim Arbeiten mit einer Zei­chen­ket­te, wie print('widgets) oder print(widgets').

Python-Skript wird nicht in einem Browser aus­ge­führt

Wenn Sie ein Python-Skript in ein Web­ver­zeich­nis fallen lassen und das Skript in einem Browser besuchen, erhalten Sie wahr­schein­lich nur den Text des Skripts in Ihrem Browser und nicht die Ausgabe des Skripts selbst.

Es gibt zwei Mög­lich­kei­ten, Python-Skripte in einem Web­brow­ser aus­zu­füh­ren:

Behandeln Sie die Python-Dateien als CGI-Skripte und führen Sie sie aus dem cgi-bin-Ver­zeich­nis aus.

In­stal­lie­ren Sie ein Web-Framework für Python.

Welche Option Sie wählen, hängt von Ihren in­di­vi­du­el­len Be­dürf­nis­sen und Vorlieben ab.

Option 1: Python-Skripte als CGI-Skripte ausführen

Um ein Python-Skript als CGI-Skript aus­zu­füh­ren, legen Sie das Skript einfach in das Ver­zeich­nis /cgi-bin/ Ihres Web­ser­vers und machen Sie die Datei mit dem Befehl aus­führ­bar:

sudo chmod 755 [filename]

Um bei­spiels­wei­se die Datei hel­lo­world.py aus­führ­bar zu machen, lautet der Befehl:

sudo chmod 755 helloworld.py

Wenn Ihr Webserver kein /cgi-bin/ kon­fi­gu­riert hat, lesen Sie unser Tutorial zur Ein­rich­tung eines CGI-Bins.

Option 2: In­stal­lie­ren Sie ein Web Framework für Python.

Ein Python-Web-Framework er­mög­licht es Ent­wick­lern, Web­an­wen­dun­gen in Python zu schreiben. Es gibt viele Web-Frame­works für Python. Jedes hat seine eigenen Vor- und Nachteile, die Sie be­rück­sich­ti­gen müssen, bevor Sie sich für eine In­stal­la­ti­on ent­schei­den.

Einige beliebte Python-Web-Frame­works be­inhal­ten:

Das of­fi­zi­el­le Python.org Wiki enthält  eine voll­stän­di­ge Liste der aktuellen (und inaktiven) Python-Web-Frame­works.

Als Beispiel werden wir Bottle in­stal­lie­ren, ein leicht­ge­wich­ti­ges Python-Web-Framework, das einfach zu in­stal­lie­ren und zu bedienen ist.

In­stal­la­ti­on von Bottle

Die In­stal­la­ti­on von Bottle auf CentOS 7 und Ubuntu 14.04 ist ein zwei­stu­fi­ger Prozess. Zuerst müssen Sie in­stal­lie­ren Pip, der ein Pa­ket­ma­na­ger für Python ist. Dann verwenden Sie Pip, um Bottle zu in­stal­lie­ren.

In­stal­la­ti­on von Bottle auf CentOS 7

Beginnen Sie mit der In­stal­la­ti­on des EPEL-Re­po­si­to­ry mit dem Befehl:

sudo yum install epel-release

Als nächstes in­stal­lie­ren Sie Pip mit dem Befehl:

sudo yum install python-pip

Verwenden Sie schließ­lich Pip, um Bottle mit dem Befehl zu in­stal­lie­ren:

sudo pip install bottle

In­stal­la­ti­on von Bottle auf Ubuntu 14.04

Zuerst in­stal­lie­ren Sie Pip mit dem Befehl:

sudo apt-get install python-pip

Verwenden Sie dann Pip, um Bottle mit dem Befehl zu in­stal­lie­ren:

sudo pip install bottle
HiDrive Cloud-Speicher
Ihr sicherer Online-Speicher
  • Daten zentral speichern, teilen und be­ar­bei­ten
  • Ser­ver­stand­ort Deutsch­land (ISO 27001-zer­ti­fi­ziert)
  • Höchste Da­ten­si­cher­heit im Einklang mit der DSGVO

Beispiel: Verwenden von Bottle zur Aus­füh­rung eines einfachen Python-Skripts

Gehen Sie in das Stamm­ver­zeich­nis Ihrer Website und erstellen Sie mit dem Befehl eine Datei namens hel­lo­world.py:

sudo nano helloworld.py

Die erste Zeile der Datei muss Bottle aufrufen, die Route im­por­tie­ren und ausführen:

from bottle import route, run

Als nächstes de­fi­nie­ren wir die Route als /hel­lo­world. Dies ist die URL, mit der Sie auf Ihr Skript zugreifen können:

@route('/helloworld')

Die nächsten beiden Zeilen de­fi­nie­ren die Hel­lo­world-Funktion, die "Hello World" an den Browser ausgibt:

def helloworld():
    return "Hello World"

Die letzte Zeile unseres Test­skripts definiert den Host und den Port, über den auf das Skript zu­ge­grif­fen wird.

  • Verwenden Sie für den Host den Do­mä­nen­na­men oder die IP-Adresse Ihres Servers.
  • Für den Port verwenden Sie 8080. Wenn sich Ihr Server hinter einer Firewall befindet, müssen Sie mög­li­cher­wei­se den Zugriff auf diesen Port erlauben, bevor Sie fort­fah­ren können.

    run(host='example.com', port=8080)

Hinweis: Sie können jeden Port für Ihre Bottle-Skripte verwenden. Port 8080 wird von der üblichen Kon­ven­ti­on für al­ter­na­ti­ve Web­diens­te verwendet. Wenn Port 8080 auf Ihrem Server verwendet wird, wählen Sie einfach einen anderen Port, der nicht verwendet wird, damit Bottle sich daran binden kann.

Das gesamte Skript lautet wie folgt:

from bottle import route, run
@route('/helloworld')
def helloworld():
    return "Hello World"
run(host='example.com', port=8080)

Speichern und beenden Sie die Datei.

Als nächstes müssen Sie das Skript von der Be­fehls­zei­le aus ausführen und es weiter ausführen, damit Sie in einem Browser auf das Skript zugreifen können. Starten Sie das Skript mit dem Befehl:

sudo python helloworld.py

Nun, da das Skript aus­ge­führt wird, wechseln Sie zu einem Browser und besuchen Sie die URL:

http://example.com:8080/helloworld

Du solltest die Worte "Hello World" im Browser sehen.

Sobald Sie fertig sind, können Sie mit'STRG + c' das Skript verlassen und zur Be­fehls­zei­le zu­rück­keh­ren.

Zum Hauptmenü