Hallo,
ich bin vor einigen Wochen mit Python angefangen, auf 2.7 (nutze Windows, macOS, beides mit xampp), nutze Visual Studio Code als Editor.
Jetzt möchte ich auf 3.x wechseln, klappt auch auf Windows (dort habe ich wohl den richtigen shebang gefunden)
Auf dem Mac kriege ich es nicht hin, ein 3.6 py-Programm auf dem Apache auszuführen
Ich habe 3.6 installiert, im Visual Studio Code kann ich auch debuggen mit pythonpath=/Library/Frameworks/Python.framework/Versions/3.6 im launch.json
In der Konsole gibt "which python3" das Ergebnis "/Library/Frameworks/Python.framework/Versions/3.6/bin/python3"
Jetzt habe ich alle möglichen shebangs (z.B. #!/Library/Frameworks/Python.framework/Versions/3.6) ausprobiert, um das Ergebnis auch auf dem Apache Webserver auszuführen. Das bekomme ich aber einfach nicht hin.
Hat irgendwer eine Idee, was das fehlende Element ist?
Vielen Dank im Voraus,
Heinz
Apache auf MacOS: findet 3.6 nicht
wenn ich
#!/Library/Frameworks/Python.framework/Versions/3.6/bin/python
nehme, funktioniert es auch nicht.
Kann aber mit /Library/Frameworks/Python.framework/Versions/3.6/bin/python3 Python über die Konsole starten, scheint also irgendwie richtig zu sein...
#!/Library/Frameworks/Python.framework/Versions/3.6/bin/python
nehme, funktioniert es auch nicht.
Kann aber mit /Library/Frameworks/Python.framework/Versions/3.6/bin/python3 Python über die Konsole starten, scheint also irgendwie richtig zu sein...
Das shebang muss ein Pfad zu einem executable sein. Ob der absolut oder relativ sein kann hängt vom PATH ab, aber deiner Ist ja absolut. Das sollte auch im Apache klapppen. Wenn nicht, kann das ja auch noch andere Ursachen haben. Dazu hat der Logfiles. Was steh da drin?
im error_log steht
[Fri Jun 30 09:02:31.094543 2017] [cgi:error] [pid 93194] [client ::1:61206] AH01215: (2)No such file or directory: exec of '/Applications/XAMPP/xamppfiles/htdocs/hebr3/work/test3.py' failed: /Applications/XAMPP/xamppfiles/htdocs/hebr3/work/test3.py
[Fri Jun 30 09:02:31.095138 2017] [cgi:error] [pid 93194] [client ::1:61206] End of script output before headers: test3.py
Aber: test3.py hat die Rechte "-rwxr-xr-x 1 Heinz admin 254 30 Jun 08:51 test3.py", sollte also ok sein (die gleichen Rechte wie ein 2.7-File
test3.py that diesen Code:
Läuft im Debugging und auch auf einem 1&1 Webserver (wenn ich den shebang entsprechend austausche)
Apache gibt im Browser diese Meldungen:
Serverfehler!
Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
End of script output before headers: test3.py
Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
localhost
Apache/2.4.23 (Unix) OpenSSL/1.0.2j PHP/5.6.28 mod_perl/2.0.8-dev Perl/v5.16.3
[Fri Jun 30 09:02:31.094543 2017] [cgi:error] [pid 93194] [client ::1:61206] AH01215: (2)No such file or directory: exec of '/Applications/XAMPP/xamppfiles/htdocs/hebr3/work/test3.py' failed: /Applications/XAMPP/xamppfiles/htdocs/hebr3/work/test3.py
[Fri Jun 30 09:02:31.095138 2017] [cgi:error] [pid 93194] [client ::1:61206] End of script output before headers: test3.py
Aber: test3.py hat die Rechte "-rwxr-xr-x 1 Heinz admin 254 30 Jun 08:51 test3.py", sollte also ok sein (die gleichen Rechte wie ein 2.7-File
test3.py that diesen Code:
Code: Alles auswählen
#!/Library/Frameworks/Python.framework/Versions/3.6/bin/python
# -*- coding: UTF-8 -*-
print ("Access-Control-Allow-Origin: *")
print( "Content-Type: text/plain; charset=utf-8\n")
import sys
print(sys.version)
Apache gibt im Browser diese Meldungen:
Serverfehler!
Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
End of script output before headers: test3.py
Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
localhost
Apache/2.4.23 (Unix) OpenSSL/1.0.2j PHP/5.6.28 mod_perl/2.0.8-dev Perl/v5.16.3
@hebr3: der Fehler im Log hat doch nichts damit zu tun, dass Python nicht gestartet werden kann. Das Skript test3.py läuft durch, die Rückgabe des Skripts entspricht aber nicht dem, was Apache erwartet, nämlich eine gültige HTTP-Antwort, wie sie als Beispiel z.B bei Wikipedia zu finden ist. Es fehlt die Status-Zeile und der Header wird nicht abgeschlossen. Damit kann Apache nichts anfangen und bricht deshalb mit einer Fehlermeldung ab.
Diese Fehlermeldung "End of script output before headers" hatte ich anfänglich ziemlich häufig, gleich ob da bei print die Klammern fehlten oder anderes. Möglich dass da statt "\n" eher ein "\n\n" bei der letzten Headerzeile gefragt ist oder anderes, könnte ich mir zumindest vorstellen.
- noisefloor
- User
- Beiträge: 3853
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@hebr3: warum quälst du dich eigentlich damit, ein Python-Skript via CGI auszuführen und nutzt nicht WSGI und ein entsprechendes Framework? Mal abgesehen davon, dass WSGI der de-facto Standard für Python Webanwendungen ist, ist der Weg auch deutlich einfacher.
Gruß, noisefloor
@hebr3: warum quälst du dich eigentlich damit, ein Python-Skript via CGI auszuführen und nutzt nicht WSGI und ein entsprechendes Framework? Mal abgesehen davon, dass WSGI der de-facto Standard für Python Webanwendungen ist, ist der Weg auch deutlich einfacher.
Gruß, noisefloor
Hallo liebe Helfer,
Danke, die Summe der Antworten hat mir geholfen:
@snafu: in der Tag hat die 3 einen Unterschied gemacht, danach bekam ich eine andere Meldung und konnte weiter forschen
@Sirius3: doch, hatte was damit zu tun: wenn ich ein 2.7 script nehme und dort im Pfad einen bewussten Fehler reinmache, bekomme ich die gleiche Antwort
@Melewo: Im 3.6 brauchte ich am Ende ein "\n", darauf bin ich dann mit deinem Tipp und der neuen Fehlermeldung gekommen - komischerweise lief es vorher auf einem 1&1 Server (3.4.2), scheint also irgendwie auch mit dem Setup zusammenzuhängen
@noisefloor: als Anfänger muss ich halt irgendwo anfangen. Da ich eine Anwendung baue, die ich auf einem 1&1 Server (ohne root-Rechte) laufen lassen will, bin ich diesen Weg gegangen. Ich werde mir aber auf jeden Fall demnächst mal WSGI anschauen, ich da nix installieren muss auf dem 1&1 Server, kann ich auch umstellen...
Vielen Dank an Euch alle!
Gruß
Heinz
so läuft es jetzt
Danke, die Summe der Antworten hat mir geholfen:
@snafu: in der Tag hat die 3 einen Unterschied gemacht, danach bekam ich eine andere Meldung und konnte weiter forschen
@Sirius3: doch, hatte was damit zu tun: wenn ich ein 2.7 script nehme und dort im Pfad einen bewussten Fehler reinmache, bekomme ich die gleiche Antwort
@Melewo: Im 3.6 brauchte ich am Ende ein "\n", darauf bin ich dann mit deinem Tipp und der neuen Fehlermeldung gekommen - komischerweise lief es vorher auf einem 1&1 Server (3.4.2), scheint also irgendwie auch mit dem Setup zusammenzuhängen
@noisefloor: als Anfänger muss ich halt irgendwo anfangen. Da ich eine Anwendung baue, die ich auf einem 1&1 Server (ohne root-Rechte) laufen lassen will, bin ich diesen Weg gegangen. Ich werde mir aber auf jeden Fall demnächst mal WSGI anschauen, ich da nix installieren muss auf dem 1&1 Server, kann ich auch umstellen...
Vielen Dank an Euch alle!
Gruß
Heinz
so läuft es jetzt
Code: Alles auswählen
#!/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
# -*- coding: UTF-8 -*-
print( "Content-Type: text/plain; charset=utf-8\n")
import sys
print(sys.version)
Zuletzt geändert von Anonymous am Freitag 30. Juni 2017, 15:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
- noisefloor
- User
- Beiträge: 3853
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Was ist das denn für ein Server? Oder hast du "nur" Webspace bei 1&1? Bottle, ein recht populäres Python Micro-Webframework kann man auch via CGI laufen lassen.
Gruß, noisefloor
Eher nicht. Die `\n` nach dem Header sind essentiell wichtig in CGI-Skripten, damit das läuft. Das ist völlig unabhängig von der Python-Version.Im 3.6 brauchte ich am Ende ein "\n", darauf bin ich dann mit deinem Tipp und der neuen Fehlermeldung gekommen - komischerweise lief es vorher auf einem 1&1 Server (3.4.2), scheint also irgendwie auch mit dem Setup zusammenzuhängen
Was ist das denn für ein Server? Oder hast du "nur" Webspace bei 1&1? Bottle, ein recht populäres Python Micro-Webframework kann man auch via CGI laufen lassen.
Gruß, noisefloor
Mal als Beispiel das ganze mit `bottle`:
Das startet beim Start einen eigenen kleinen HTTP-Server der auf dem lokalen Rechner auf Port 8080 auf Verbindungen wartet. Wenn man beim `run()`-Aufruf statt 'wsgiref' den Wert 'cgi' übergibt, dann verhält sich das Programm wie ein CGI-Skript.
Edit: Besser wäre natürlich wenn der Webserver auf dem 1&1-Server WSGI könnte.
Code: Alles auswählen
import sys
from bottle import route, run
@route('/')
def index():
return sys.version
if __name__ == '__main__':
run(server='wsgiref', host='127.0.0.1', port=8080, reloader=True)
Edit: Besser wäre natürlich wenn der Webserver auf dem 1&1-Server WSGI könnte.
ich habe leider nur ein Vertrag "Hosting Basic", d.h. keine Root-Rechte und kann keine weiteren Module selber installieren
--> bottle und weiteres steht mir nicht zur Verfügung
Nochmal vielen Dank an alle, ich kann jetzt auf Windows/macOS lokal entwickeln und dann nach 1&1 deployen (muss halt die sheban-Zeile austauschen)
--> bottle und weiteres steht mir nicht zur Verfügung
Nochmal vielen Dank an alle, ich kann jetzt auf Windows/macOS lokal entwickeln und dann nach 1&1 deployen (muss halt die sheban-Zeile austauschen)
@hebr3: Doch, bottle.py steht zur Verfügung: Das ist *eine* Python-Datei, die Du einfach in den Ordner kopieren kannst wo das Modul liegt das ausgeführt wird.
Nur zum Testen hatte ich aus einem Buch oder aus dem Web noch ein anderes Beispiel. Nach jedem Windows-Update muss ich zuvor den WWW-Publishingdienst beenden, um Port 80 benutzen zu können, doch wenn ich den dann über IDLE starte, lässt sich eine Testseite ohne Angabe eines Ports normal im Browser mit "http://localhost/cgi-bin/test.py" aufrufen. Ein cgi-bin mit Testseiten liegt im selben Verzeichnis. Benutzte es bisher nur selten und nur für kleine Tests. Wie sich das nun unter Mac OS verhält, weiß ich jedoch nicht.
Code: Alles auswählen
from http.server import CGIHTTPRequestHandler, HTTPServer
handler = CGIHTTPRequestHandler
with HTTPServer(("", 80), handler) as httpd:
print("Server laeuft!")
httpd.serve_forever()