Cool, soll noch mal einer sagen, dass mein Vorhaben unmöglich ist
Was, für Vorteile hat subprocess gegenüber os.popen?
Einen Nachteil hat subprocess auf jeden Fall nämlich erst ab der neuesten Version verfügbar. Unter Linux (Gentoo) kann das installieren einer neuen Python Version jegliches (portage) vom ordentlichen Funktionieren abhalten.
Danke, Dominik
Transparente Durchreiche zur Konsole?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hast du eigentlich kein Problem, das dein CGI Skript mit dem User nobody läuft und du somit kaum Rechte hat???
Ich habe noch keine Lösung gefunden: http://python.sandtner.org/viewtopic.php?t=2611
Ich habe noch keine Lösung gefunden: http://python.sandtner.org/viewtopic.php?t=2611
Noch nicht, da ich erst am experimentieren bin (läuft noch nicht über das server script).Hast du eigentlich kein Problem, das dein CGI Skript mit dem User nobody läuft und du somit kaum Rechte hat???
Hat mir jemand ein beispiel, wie man mit den Stdin, stdout und stderr file descriptors communitiert, ich scheine mich gerade mächtig dämlich an zu stellen.
Gruss, Dominik
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
jens, könnte das die Lösung sein?
Gruss, Dominiktcsetpgrp( fd, pg)
Set the process group associated with the terminal given by fd (an open file descriptor as returned by open()) to pg. Availability: Unix.
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
Wenn ich das richtig verstehe, kann man damit die Gruppe (Rechte) ändern des Terminals. Da dein Unterprozess in diesem Terminal läuft folglich auch die Rechte des Programms, dass du aufrufst.
Gruss, Dominik
Gruss, Dominik
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Vorteil? Es kann alles was os.popen kann, auch was popen2.popen, popen2.popen2, popen2.popen3 können. Aber leider ist es irgendwie.. kompliziert.Anonymous hat geschrieben:Was, für Vorteile hat subprocess gegenüber os.popen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das ist ja das Problem, weswegen su nicht klappt:Slalomsk8er hat geschrieben:Wenn ich das richtig verstehe, kann man damit die Gruppe (Rechte) ändern des Terminals. Da dein Unterprozess in diesem Terminal läuft folglich auch die Rechte des Programms, dass du aufrufst.
s. http://python.sandtner.org/viewtopic.php?p=14778#14778su: must be run from a terminal
Somit läuft der Unterprozess nicht im Terminal und ich denke das man dann mit tcsetpgrp() nicht viele machen kann...
Es funktioniert auf die gleiche (komplizierte) Weise plattformübergreifend, war glaube ich ein Vorteil.Leonidas hat geschrieben:Vorteil? Es kann alles was os.popen kann, auch was popen2.popen, popen2.popen2, popen2.popen3 können. Aber leider ist es irgendwie.. kompliziert.Anonymous hat geschrieben:Was, für Vorteile hat subprocess gegenüber os.popen?
Das hat mit der Gruppe aus den Zugriffsrechten nichts zu tun. Es geht dabei um Prozessgruppen. Wenn Du Prozesse asynchron von einem Programm aus startest und dieses dann killst, dann werden auch die Kindprozesse beendet, wenn sie in der gleichen Prozessgruppe sind. Wenn sie in einer anderen/eigenen Prozessgruppe sind, dann können die Kindprozesse trotzdem weiterlaufen.Slalomsk8er hat geschrieben:Wenn ich das richtig verstehe, kann man damit die Gruppe (Rechte) ändern des Terminals. Da dein Unterprozess in diesem Terminal läuft folglich auch die Rechte des Programms, dass du aufrufst.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Wie sieht es denn bei dir aus? Stand der Dinge meine ich... Kann man es schon sehenSlalomsk8er hat geschrieben:Das Ganze sollte eine CGI-HTML-Seite werden mit einem Konsolenfenster und soll sich identisch verhalten, wie die Konsole im Hintergrund (auch ncurses soll 1 zu 1 rüberkommen).
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
Nö leider nicht.
Ich habe mich mal wider einerm anderen Projekt zugewendet Bunnyfight (ich bin der main 3D Artist).
Pexpect experimente waren das Letzte, was ich gemacht hatte (bin mir nicht sicher ob das das Richtige ist). Ach ja, einen Hilferuf an die Pythonnewsgroup hatte ich auch gestartet, jedoch keine Hilfreichen Antworten erhalten.
Gruss, Dominik
Ich habe mich mal wider einerm anderen Projekt zugewendet Bunnyfight (ich bin der main 3D Artist).
Pexpect experimente waren das Letzte, was ich gemacht hatte (bin mir nicht sicher ob das das Richtige ist). Ach ja, einen Hilferuf an die Pythonnewsgroup hatte ich auch gestartet, jedoch keine Hilfreichen Antworten erhalten.
Gruss, Dominik
-
- User
- Beiträge: 25
- Registriert: Samstag 22. Januar 2005, 19:43
Gescheitert ist da noch gar nichts.
Das ist so meine Art Dinge zu Erledigen.
Multitasking hält den Frustfaktor gering, da ich dann halt an einem anderen Projekt weiter arbeite und so nach ca. einer Woche weiter knoble (falls ich überhaupt solange die Finger von lassen kann).
Das GMC-Projekt ist schon ein Jahr alt und falls keiner das gleiche vor mir baut, werde ich weiter arbeiten.
Gruss, Dominik
Das ist so meine Art Dinge zu Erledigen.
Multitasking hält den Frustfaktor gering, da ich dann halt an einem anderen Projekt weiter arbeite und so nach ca. einer Woche weiter knoble (falls ich überhaupt solange die Finger von lassen kann).
Das GMC-Projekt ist schon ein Jahr alt und falls keiner das gleiche vor mir baut, werde ich weiter arbeiten.
Gruss, Dominik
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also ich bin mit meiner Variante schon mal ein wenig weiter, nach dem ich den Server mit Python selber mache und diesen so modifiziere, das kein fork verwendet wird. Somit werden Skripte mit dem User ausgeführt, mit dem der Server gestartet wurde:
http://python.sandtner.org/viewtopic.php?p=16132#16132
Und hier eine erste Version einer "console":
Nun könnte ich mal probieren statt os.popen() vielleicht das neue subprocess() zu nutzen, aber so klappt das auch erstmal... Ein nachteil von popen(), es werden stderr ignoriert, aber das ist bei subprocess() ja anders...
http://python.sandtner.org/viewtopic.php?p=16132#16132
Und hier eine erste Version einer "console":
Code: Alles auswählen
#!/usr/bin/python
import os, sys, locale
print "Content-type: text/html\n\n"
html='''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=%(charset)s" />
<title>console @ %(uname)s</title>
</head>
<body>
<form name="form1" id="form1" method="post" action="%(self)s">
<p><textarea name="stdout" cols="100" rows="30" id="stdout">%(stdout)s</textarea></p>
<p><input name="cls" type="checkbox" id="cls" />cls</p>
<p><input name="cmd" type="text" id="cmd" size="150" /></p>
</form>
</body>
</html>'''
def GetCGIdaten():
"CGI POST und GET Daten zur einfacheren Verarbeitung zusammen in ein Dict packen"
CGIdaten={}
if os.environ.has_key('QUERY_STRING'):
# POST URL-Parameter parsen
for i in os.environ['QUERY_STRING'].split("&"):
i=i.split("=")
if len(i)==1:
if i[0]!="":
CGIdaten[ i[0] ] = ""
else:
CGIdaten[ i[0] ] = i[1]
from cgi import FieldStorage
FieldStorageData = FieldStorage()
# GET Daten auswerten
for i in FieldStorageData.keys():
CGIdaten[i]=FieldStorageData.getvalue(i)
return CGIdaten
CGIdaten = GetCGIdaten()
txt = ""
if CGIdaten.has_key("stdout") and not CGIdaten.has_key("cls"):
# Alte Ausgaben wieder anzeigen
txt = CGIdaten["stdout"]
# "Prompt" hinzufügen
txt += os.getcwd()+"> "
if CGIdaten.has_key("cmd"):
# Befehl ausfühen
Befehl = CGIdaten["cmd"]
txt += Befehl+"\n"
txt += os.popen( Befehl ).read()
print html % {
"charset" : locale.getdefaultlocale()[1],
"uname" : os.popen("uname -a").read(),
"self" : os.environ['SCRIPT_NAME'],
"stdout" : txt
}
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das Modul popen2 kann das auch. Aber subprocess ist natürlich viel lustiger.jens hat geschrieben:Nun könnte ich mal probieren statt os.popen() vielleicht das neue subprocess() zu nutzen, aber so klappt das auch erstmal... Ein nachteil von popen(), es werden stderr ignoriert, aber das ist bei subprocess() ja anders...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Jetzt hab ich's mit subprocess:
Code: Alles auswählen
#!/usr/bin/python
import cgitb ; cgitb.enable()
import os, sys, locale, subprocess
print "Content-type: text/html\n\n"
html='''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=%(charset)s" />
<title>console @ %(uname)s</title>
</head>
<body>
<form name="form1" id="form1" method="post" action="%(self)s">
<p><textarea name="stdout" cols="100" rows="30" id="stdout">%(stdout)s</textarea></p>
<p><input name="cls" type="checkbox" id="cls" />cls</p>
<p><input name="cmd" type="text" id="cmd" size="150" /></p>
</form>
</body>
</html>'''
def GetCGIdaten():
"CGI POST und GET Daten zur einfacheren Verarbeitung zusammen in ein Dict packen"
CGIdaten={}
if os.environ.has_key('QUERY_STRING'):
# POST URL-Parameter parsen
for i in os.environ['QUERY_STRING'].split("&"):
i=i.split("=")
if len(i)==1:
if i[0]!="":
CGIdaten[ i[0] ] = ""
else:
CGIdaten[ i[0] ] = i[1]
from cgi import FieldStorage
FieldStorageData = FieldStorage()
# GET Daten auswerten
for i in FieldStorageData.keys():
CGIdaten[i]=FieldStorageData.getvalue(i)
return CGIdaten
CGIdaten = GetCGIdaten()
def cmd( command ):
process = subprocess.Popen( command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
return process.stdout.read() + process.stderr.read()
txt = ""
Netzwerknamen = cmd( "uname -n" )
if CGIdaten.has_key("stdout") and not CGIdaten.has_key("cls"):
# Alte Ausgaben wieder anzeigen
txt = CGIdaten["stdout"]
# "Prompt" hinzufügen
txt += os.getcwd()+"> "
if CGIdaten.has_key("cmd"):
# command ausfühen
command = CGIdaten["cmd"]
txt += command+"\n"
txt += cmd( command )
print html % {
"charset" : locale.getdefaultlocale()[1],
"uname" : cmd("uname -a"),
"self" : os.environ['SCRIPT_NAME'],
"stdout" : txt
}
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nun so nebenbei: da wo du Post und Get parst... kann es ein das du die falsch beschriftet hast? GET ist doch das mit '&' und POST ist doch das was nicht in der URL vorkommt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Das kann ich auch nie Auseinander halten, aber lauf selfhtml http://de.selfhtml.org/cgiperl/intro/fo ... m#get_post stimmt das so, wie ich es kommentiert hab... oder sehe ich da was falsch?!?