Apache auf MacOS: findet 3.6 nicht

Probleme bei der Installation?
Antworten
hebr3
User
Beiträge: 5
Registriert: Freitag 30. Juni 2017, 06:31

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der shebang muss auf ein executable zeigen. Also enden mit bin/python
hebr3
User
Beiträge: 5
Registriert: Freitag 30. Juni 2017, 06:31

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...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
hebr3
User
Beiträge: 5
Registriert: Freitag 30. Juni 2017, 06:31

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:

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)
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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn dein Shebang auf python endet, das Executable jedoch python3 heißt, dann schreib doch einfach mal die 3 mit dazu...
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
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
User
Beiträge: 5
Registriert: Freitag 30. Juni 2017, 06:31

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

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.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
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
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.

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
BlackJack

Mal als Beispiel das ganze mit `bottle`:

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)
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.
hebr3
User
Beiträge: 5
Registriert: Freitag 30. Juni 2017, 06:31

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)
BlackJack

@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.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

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()
BlackJack

@Melewo: Ein Webserver ist doch schon vorhanden: Apache. Steht auch im Betreff. :-)
Antworten