Merkwürdiges Verhalten des Apache bei Python-CGI

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Robert
User
Beiträge: 3
Registriert: Sonntag 2. März 2003, 12:50
Wohnort: Berlin
Kontaktdaten:

Samstag 5. April 2003, 14:20

Da ich nicht bei jedem Python-Script den Pfad zum Interpreter angeben will habe ich einen Handler in der httpd.conf für Python angelegt.

httpd.conf auszug

Code: Alles auswählen

#--------Python script settings-----------------------------------------------

ScriptAlias /cgi-python/ "/home/robert/development/python/cgi-bin/"
AddHandler python-script .py .pyc .pyo
Action python-script "/cgi-python/python"

<Directory "/home/robert/development/python/cgi-bin/">
	Order deny,allow
	Deny from all
	Allow from 127.0.0.1
</Directory>


#--------PHP script settings--------------------------------------------------

ScriptAlias /cgi-php/ "/home/robert/development/php/cgi-bin/"
AddType php-script .php .php3 .php4
Action php-script "/cgi-php/php"

<Directory "/home/robert/development/php/cgi-bin/">
	Order deny,allow
	Deny from all
	Allow from 127.0.0.1
</Directory>


#--------TCL script settings--------------------------------------------------

ScriptAlias /cgi-tcl/ "/home/robert/development/tcl/cgi-bin/"
AddType tcl-script .tcl
Action tcl-script "/cgi-tcl/tclsh"

<Directory "/home/robert/development/tcl/cgi-bin/">
	Order deny,allow
	Deny from all
	Allow from 127.0.0.1
</Directory>

Alle Executables sind Symlinked in die entsprechenden Directories und der Apacheuser hat Lese- und Executerechte. Die Interpreter werden alle gefunden. Allerdings funktioniert nur der PHP-Interpreter wie vorgesehen!! Bei Python und TCL kommt ein Server Error 500.
Das log dazu sieht folgendermaßen aus:

Code: Alles auswählen

[Sat Apr 05 14:30:14 2003] [error] [client 127.0.0.1] Premature end of script headers: python
bzw. bei TCL:

Code: Alles auswählen

[Sat Apr 05 14:54:38 2003] [error] [client 127.0.0.1] Premature end of script headers: tclsh
Hier habe ich noch mal den Code für den Pythonscript - primitiver geht es eigentlich ja nicht mehr.

Code: Alles auswählen

print "Content-type: text/html \n\n"
print "cgi is running"
Kennt jemand eine Lösung oder weiß er warum nur PHP funktioniert und kein anderer Script?
Ich habe langsam keine Ideen mehr wo es liegen könnte. Es scheint als würden die Interpreter den Dateipfad nicht auflösen können oder so etwas in dieser Richtung.
Robert Elsner
Robert
User
Beiträge: 3
Registriert: Sonntag 2. März 2003, 12:50
Wohnort: Berlin
Kontaktdaten:

Montag 7. April 2003, 00:15

Nach nun etlichen Stunden des Bastelns habe ich eine Lösung gefunden. Es ist scheinbar nicht möglich den Pythoninterpreter direkt aufzurufen. Deswegen muss ein Wrapper (der leider dann doch das nervige #!/usr/bin/python in der ersten Zeile hat) herhalten.

Listing pywrap.py

Code: Alles auswählen

#!/usr/bin/python

"""This is a small wrapper script used to enable global python execution
within the Apache web server. It simply executes the file given by
the PATH_TRANSLATED environment variable."""

author="Robert Elsner"
version="0.03"
stage="beta 1"

#importing OS and reading PATH_TRANSLATED
import os, sys, string
str_path_translated=os.environ["PATH_TRANSLATED"]
str_path_info=os.environ["PATH_INFO"]

#tweaking some environment vars so that the called script
#works as supposed

#extracting script directory and make it the current working dir
str_script_directory=str_path_translated[:str_path_translated.rfind("/")]
os.chdir(str_script_directory+"/")

#updating env vars
os.environ["SCRIPT_FILENAME"]=str_path_translated
os.environ["SCRIPT_NAME"]=str_path_info
sys.path[0]=str_script_directory

#executing the file
execfile(str_path_translated)

Dieser macht eigentlich nichts weiter als das Arbeitsverzeichnis zu wechseln und einige Umgebungsvars umzuschreiben.
Die httpd.conf sieht dann folgendermaßen aus:

Code: Alles auswählen

#--------Python script settings-----------------------------------------------

ScriptAlias /cgi-python/ "/home/robert/development/python/cgi-bin/"
AddType python-script .py .pyc .pyo
Action python-script "/cgi-python/pywrap.py"

<Directory "/home/robert/development/python/cgi-bin/">
	Order deny,allow
	Deny from all
	Allow from 127.0.0.1
</Directory>

Mit diesen Einstellungen arbeiten derzeit alle Scripte einwandfrei. Um Warnings im error.log zu vermeiden sollte man den Handler besser application/x-http-python anstatt python-script nennen. Falls jemand eine bessere Lösung findet wäre ich froh wenn er mir eine Nachricht zukommen ließe.
Robert Elsner
Antworten