Python Server findet Datei nicht.

Django, Flask, Bottle, WSGI, CGI…
Antworten
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

Hallo zusammen,

mir ist klar, schon viele haben das Problem, Python-Server findet Datei nicht, aber die die ich bisher gefunden habe helfen mir nicht weiter. Unter anderem weil ich die Datei sehen kann, und Python auch.

Meine Frage ist nun wo steckt mein Fehler?
Die Datei unter /cgi-bin/abstimmung2.py wird nicht gefunden.
Die Datei unter /cgi-bin/uhrzeit2.py wird gefunden.

Der Ordner /cgi-bin/ ist im Ordner /httpserver/ in diesem wurde auch der Server gestartet.

Auf dem Bild seht ihr links: Das die Shell die Datei öffnet und die Befehle »os.path« und »os.listdir« die Datei ebenfalls sehen.
Rechts oben seht ihr: Das der Pfad und die Datei auch im Terminal gefunden und geöffnet werden.
Rechts unten seht ihr: Die Fehlermeldung vom Server sowie den funktionierenden Aufruf einer anderen Datei im selben Ordner.

Kann mir bitte jemand verraten, warum die Datei vom Server nicht gefunden wird?

Bild
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist jetzt nur eine Vermutung, aber Leerzeichen in Pfaden ist immer eine doofe Idee. Pack also zB einen _ in 22_CGI, und schau, ob's besser wird.
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

__deets__ hat geschrieben: Sonntag 27. Juni 2021, 12:43 Ist jetzt nur eine Vermutung, aber Leerzeichen in Pfaden ist immer eine doofe Idee. Pack also zB einen _ in 22_CGI, und schau, ob's besser wird.
Danke, aber daran liegt es nicht. Andere Dateien im selben Ordner funktionieren ja.

Bild: http://menkel-online.de/Images/Fehler.jpg

Bild
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du es probiert? Oder glaubst du das nur? Dein CGI Skript wird anders gestartet als deine Dateien ausgeliefert, und bei einem Aufruf wie execve kann so etwas eine Rolle spielen. Ich rate also nachdrücklich dazu, es wenigstens mal zu probieren.
Ich habe Quatsch geschrieben. Du hast ja andere CGI Skripte, das habe ich übersehen. Dachte es geht um zb Bilder oder HTML.

Ist der shebang des CGI Skripts korrekt?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ist die Datei denn ausführbar?
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

__deets__ hat geschrieben: Sonntag 27. Juni 2021, 20:57 Ist der shebang des CGI Skripts korrekt?
Nachdem ich das Problem nun nachstellen konnte, ist genau das vermutlich das Problem. Wenn das Skript nicht ausführbar ist, loggt http.server "code 403, message CGI script is not executable". Wenn das Script nicht gefunden wird, loggt http.server "code 404, message No such CGI script". Wenn das Script einen intendierten Syntax-Fehler hat, loggt http.server den Syntaxfehler und dann "CGI script exit status 0x100". Aber wenn ich in die Shebang-Zeile nicht den korrekten Pfad eines Executable angebe, loggt http.server genau das, was der TO zeigt.
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

Danke für die Hilfe bisher,
Ist der shebang des CGI Skripts korrekt?
Der shebang ist, wie in allen anderen Skripten die laufen, »#!/usr/bin/python3«, und sollte daher doch stimmen.
Alle anderen Skripte in dem Ordner lassen sich aufrufen, nur dieses eine versagt beim Aufruf im Browser.
In der Shell und im Terminal geht es.
Ist die Datei denn ausführbar?
Ja, in der Shell und im Terminal lüft die Datei. Nur nicht im Browser. Die Rechte sind:
ls -l abstimmung2.py
-rwxrwxrwx 1 valentin valentin 2545 Jun 28 13:03 abstimmung2.py

______________________________________________________________________

Die Meldung vom Server ist:

Code: Alles auswählen

Exception happened during processing of request from ('127.0.0.1', 55630)
Traceback (most recent call last):
  File "/usr/lib/python3.8/http/server.py", line 1179, in run_cgi
    os.execve(scriptfile, args, env)
NotADirectoryError: [Errno 20] Not a directory: '/mnt/sda5/scripts/python/Buch/22_CGI/httpserver/cgi-bin/abstimmung2.py'
----------------------------------------
127.0.0.1 - - [28/Jun/2021 12:50:23] CGI script exit status 0x7f00

Wie hier http://menkel-online.de/Images/Fehler.jpg zusehen ist sie aber für Shell und Terminal zuerkennen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Moment. Da ist jetzt ein Unterstrich im Pfad. Aber nicht im Bild. Das muss schon konsistent sein.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

valentinks hat geschrieben: Montag 28. Juni 2021, 12:35 Die Meldung vom Server ist:

Code: Alles auswählen

Exception happened during processing of request from ('127.0.0.1', 55630)
Traceback (most recent call last):
  File "/usr/lib/python3.8/http/server.py", line 1179, in run_cgi
    os.execve(scriptfile, args, env)
NotADirectoryError: [Errno 20] Not a directory: '/mnt/sda5/scripts/python/Buch/22_CGI/httpserver/cgi-bin/abstimmung2.py'
"Not a directory" (ENOTDIR) ist offensichtlich ein ganz anderer Fehler als "das No such file or directory" (ENOENT) von weiter oben. Also ist jetzt irgend etwas anders als in Deinen früheren Screenshots. Ansonsten gilt in Abwandlung eines beliebten Spruchs unter Juristen: ein Blick in den Code erleichtert die Fehlersuche.
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

LukeNukem hat geschrieben: Montag 28. Juni 2021, 13:25
"Not a directory" (ENOTDIR) ist offensichtlich ein ganz anderer Fehler als "das No such file or directory" (ENOENT) von weiter oben. Also ist jetzt irgend etwas anders als in Deinen früheren Screenshots. Ansonsten gilt in Abwandlung eines beliebten Spruchs unter Juristen: ein Blick in den Code erleichtert die Fehlersuche.
Bleibt nur noch das ich schon länger in den Code blicke und einfach nicht erkenne warum diese eine Datei nicht läuft.

Screenshots mit der Änderung: keine Leerzeichen
Bild
Fehler: http://menkel-online.de/Images/Fehler2.jpg
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

valentinks hat geschrieben: Montag 28. Juni 2021, 12:35 Der shebang ist, wie in allen anderen Skripten die laufen, »#!/usr/bin/python3«, und sollte daher doch stimmen.
Wenn du die Datei so aufrufst wie gezeigt, nämlich als 'python3 deinskript.py', ist die Shebang irrelevant, da du gar nicht das Skript direkt ausführst, sonst den Python-Interpreter, der das Skript dann lädt; das ist technisch etwas anderes. Hast du es auch mit "'./deinskript.py" getestet? Die Shebang sollte nach Möglichkeit außerdem "#!/usr/bin/env python3" lauten. Meine Erfahrung ist, dass Fehler wie deiner in aller Regel davon kommen, dass irgendwas mit der Shebang oder den Permissions nicht stimmt; die Permission scheinen aber ja korrekt zu sein.

Ansonsten, weil es noch keiner gesagt hat, der allgemeine Hinweise: CGI macht man heute eigentlich eher nicht mehr. Aus Nostalgiegründen ist das okay. Wenn man moderne Webentwicklung lernen möchte, ist das aber eher nicht der richtige Weg.
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

Danke für die lange Antwort
nezzcarth hat geschrieben: Montag 28. Juni 2021, 17:23 Wenn du die Datei so aufrufst wie gezeigt, nämlich als 'python3 deinskript.py', ist die Shebang irrelevant, da du gar nicht das Skript direkt ausführst, sonst den Python-Interpreter, der das Skript dann lädt; das ist technisch etwas anderes.
Der Aufruf im Terminal ist nur dafür da um zuzeigen das die Datei tatsächlich von Python gefunden werden kann, also tatsächlich existiert, nur nicht für den Server.
nezzcarth hat geschrieben: Montag 28. Juni 2021, 17:23 Hast du es auch mit "'./deinskript.py" getestet? Die Shebang sollte nach Möglichkeit außerdem "#!/usr/bin/env python3" lauten. Meine Erfahrung ist, dass Fehler wie deiner in aller Regel davon kommen, dass irgendwas mit der Shebang oder den Permissions nicht stimmt; die Permission scheinen aber ja korrekt zu sein.
Wenn ich die Shebang wie vorgeschlagen ändere bekomme ich eine neue Fehlermeldung:
/usr/bin/env: »python3\r“: Datei oder Verzeichnis nicht gefunden
nezzcarth hat geschrieben: Montag 28. Juni 2021, 17:23 Ansonsten, weil es noch keiner gesagt hat, der allgemeine Hinweise: CGI macht man heute eigentlich eher nicht mehr. Aus Nostalgiegründen ist das okay. Wenn man moderne Webentwicklung lernen möchte, ist das aber eher nicht der richtige Weg.
Gelesen hab ich das schon öfter da das Buch, das nebenbei bemerkt viele nicht funktionierende Skripte enthält, so aufgebaut ist würde ich gern dieses letzte Skript noch beenden. Vor allem weil ich wissen will warum dieses eine Skript nicht läuft.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Da ist ja der Fehler. Die Zeilenendezeichen sind falsch. Deine Datei hat die DOS-Zeichenfolge "\r\n", die Shebang-Zeile darf aber nur das Unix-Zeilenende "\n" haben. Jeder einigermaßen vernünftige Editor kann das konvertieren.
valentinks
User
Beiträge: 20
Registriert: Sonntag 27. Juni 2021, 10:31
Wohnort: Kassel

Sirius3 hat geschrieben: Montag 28. Juni 2021, 18:34 Da ist ja der Fehler. Die Zeilenendezeichen sind falsch. Deine Datei hat die DOS-Zeichenfolge "\r\n", die Shebang-Zeile darf aber nur das Unix-Zeilenende "\n" haben. Jeder einigermaßen vernünftige Editor kann das konvertieren.
Danke. Das war's. Danke.
Ich dachte die Python IDLE könnte das. :?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@valentinks: IDLE ist eben kein vernünftiger Editor. ;-)
Antworten