Seite 1 von 1

cgi + os.system = error (xampp, win)

Verfasst: Freitag 6. Juli 2007, 11:09
von Zack
Ich möchte ein Python script über cgi ausführen. Leider gibt os.system mir immer nur ne "1" zurück, statt das script auszuführen. Beim direkten ausführen über cmd läuft es wunderbar, aber in verbindung mit dem cgi script über den apache(xampp) lässt sichs nicht starten. Das auszuführende Script ist ein builder zum compelieren von pascal-sources. Ich denke es liegt an dem cgi script oder an den apache confs. Bei beiden weiß ich aber leider nicht was zu so einem Problem führt.

cgi-script:

Code: Alles auswählen

#!C:\Programme\xampp\python\python.exe
import sys, os, traceback, cgi
sys.stderr = sys.stdout

def main():
	sys.stderr = sys.stdout
#	os.chdir(os.path.join("D:\","workdir","builder","Python"))
	print "Content-type: text/html\n\n"
	form = cgi.FieldStorage()	#parse query
	if form.has_key("build") and form["build"].value != "":
		print os.system("D:\\workdir\\builder\\Python\\builder.py "+ form["build"].value)
		print
		print "<h1> Build-Script </h1><br>"
		print "Script is starting: build.py ", form["build"].value, "<br>"
		print form["name"].value, ", thank you for using this Script <br>"
	else:
		print "<h1> Error! Please Enter Parameter.</h1>"
main()
index.html:

Code: Alles auswählen

<form method="POST" action="http://localhost/cgi-bin/loader.cgi">
	<p>build.py <input type="text" name="build" value="">
	<p>Click here to submit form: <input type="submit" value="Yeah!">
	<input type="hidden" name="session" value="1f9a2">
</form>
Result:

Code: Alles auswählen

1
Build-Script

Script is starting: build.py Simulator ConsoleCoach all
sdf , thank you for using this Script 
Ich hoffe jemand weiß Rat. Danke im Vorraus.

mit freundlichem Gruß
Zack

Verfasst: Freitag 6. Juli 2007, 11:47
von gerold
Hallo Zack!

Nimm statt ``os.system`` ``subprocess.Popen``. Beispiele dafür findest du genug hier im Forum und im Wiki. http://wiki.python.de/

mfg
Gerold
:-)

Verfasst: Freitag 6. Juli 2007, 11:51
von jens
@Zack: Warum machst du das überhaupt über os.system/subprocess? Warum importierst du nicht builder.py und benutzt es direkt?

Verfasst: Freitag 6. Juli 2007, 14:00
von Zack
Mit subprocess.popen führt es leider auch zu keinem Erfolg. Nach dem absenden/übergeben der Parameter an das cgi-Script, kommt nur ein "Warten auf localhost...". Das gleiche passiert übrigends, wenn ich statt dem builder.py einfach netstat oder notepad ausführen will.
@jens: Der builder.py führt aber ebenfalls andere Prozesse aus. Damit wäre das Problem weiterhin bestehend, auch wenn es dann etwas eleganter wäre.

Verfasst: Freitag 6. Juli 2007, 14:05
von jens
Das ist ein generelles Problem, mit subprocess/os.system und blockierenden Ausgaben der Programme. Es hat also nicht direkt was mit CGI zu tun...

Versuche das gleiche erstmal mit einem lokalen Skript.

Schau mal hier:
http://www.python-forum.de/topic-2875.html
http://www.python-forum.de/topic-4941.html

Ohne Worte

Verfasst: Freitag 6. Juli 2007, 14:22
von gerold

Code: Alles auswählen

>>> import subprocess
>>> args = ["cmd", "/C", "dir", "J:\\", "/O", "/AD", "/B"]
>>> process = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
>>> print process.stdout.read()
Ablage
Apache
CanoScan
cygwin
Dokumente und Einstellungen
Karrigell
KDE
MinGW
MoinMoin
Office10
PROG
program files
Programme
Python24
Python25
RECYCLER
Sicherungen
System Volume Information
WINDOWS
xampp
Zope-Instance

>>>

Verfasst: Donnerstag 12. Juli 2007, 08:14
von Zack
Danke erstmal für die Hilfe.
Soweit startet mein Script schon mal und gibt die Ausgabe im Browser wieder.
Leider bricht er bei bestimmten Python-Kommandos aus mir unerfindlichen Gründen immer ab.

Ab Zeile 13 geht's nicht mehr weiter. Ich kann nicht ganz nachvollziehen, was mir den "Zugriff verweigert".

Code: Alles auswählen

Import win32net
remote = {}
for x in os.popen('netstat').readlines():
    i = x
    if (i.find(":3389") > 0):
        if not (i.find(":3389") > i.find(":")):
            remote["ip"] = i[i.find(":3389")+5:i.rfind(":")].strip()
            remote["port"] = i[i.rfind(":")+1:i.rfind(":")+6].strip()

if not remote.has_key("ip"):
    remote = {'ip': '127.0.0.1', 'port': '0'}

remote["info"] = win32net.NetWkstaGetInfo(remote["ip"],100)
(Die Code-Passage speichert die Daten des Remote-Clients, sofern einer verbunden ist.)

Code: Alles auswählen

C:\Programme\xampp\cgi-bin> Traceback (most recent call last): File "D:\workdir\wBuildManager2\Python\wBuildManager.py"
, line 13, in ? remote["info"] = win32net.NetWkstaGetInfo(remote["ip"],100) pywintypes.error: (5, 'NetWkstaGetInfo', 'Zugriff verweigert')
Könnten es die importierten win32net Funktionen sein, die mir verweigert werden?

Verfasst: Donnerstag 12. Juli 2007, 10:53
von jens
Der "Zugriff verweigert" Fehler hört sich irgendwie so an, als wenn dieser von Windows erzeugt wurde.
Mit welchem User läuft dein Skript dann als CGI? Darf dieser das auch dieses win32net.NetWkstaGetInfo() ausführen?

Verfasst: Donnerstag 12. Juli 2007, 11:26
von Zack
ja, das Script selbst lässt sich wunderbar mit dem selben Benutzer ausführen. Der Fehler tritt nur beim starten über das cgi-Script auf.

Verfasst: Donnerstag 12. Juli 2007, 12:13
von gerold
Zack hat geschrieben:ja, das Script selbst lässt sich wunderbar mit dem selben Benutzer ausführen.
Hallo Zack!

Um die Frage konkreter zu stellen:

Läuft der Apache als Dienst (dann läuft er nicht unter deinem Benutzer) oder läuft der Apache in einer Dos-Box?

Als Dienst wird dem Apachen kein Benutzer zugewiesen. Dann hilft es eventuell schon, wenn du dem Dienst einen Benutzer zuweisen würdest, der genug Rechte besitzt um ``NetWkstaGetInfo`` ausführen zu dürfen. Oder du führst das CGI als anderer Benutzer aus. --> http://httpd.apache.org/docs/2.2/suexec.html Keine Ahnung, ob das auch unter Windows funktioniert...

mfg
Gerold
:-)

Verfasst: Donnerstag 12. Juli 2007, 16:18
von Zack
@gerold: danke, das war's. Hätte ich auch drauf kommen müssen.
Nun läuft alles mit seiner gewohnten Routine. Ihr seid die größten \o/