Im CGI Script subprocess und os.execv nicht möglich ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,
kann es sein, daß man aus einem CGI-Script heraus keine anderen Python-Scripte aufrufen kann ?
Also das hier Beides funktioniert nicht:

Code: Alles auswählen

args = []
os.execv("/srv/www/cgi-bin/fenster.py",args)
bzw:

Code: Alles auswählen

p = subprocess.Popen("/srv/www/cgi-bin/fenster.py",shell=True)
Oder hat das wieder was mit den Rechten unter Linux zu tun ? Das Script fenster.py ist 'ausführbar' und im Ordner cgi-bin.

Gruss, Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was ist die Fehlermeldung (Traceback/error.log)?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi,
es liegt wohl am Script, welches aufgerufen wird. Hatte immer weissen Bildschirm ohne Fehlermeldung. Also wenn Tkinter mit im Spiel ist gehts nicht. Hier das
Script, welches ich aufgerufen habe:

Code: Alles auswählen

#!/usr/bin/python2.4
from Tkinter import Tk
from tkSnack import Sound,initializeSnack
import time,string,os,sys,popen2,subprocess

root =  Tk()
initializeSnack(root)

datei = open("/srv/www/Bestell1/test.txt","a")
datei.close()

root.mainloop()
Ohne

Code: Alles auswählen

root =  Tk()
initializeSnack(root)
root.mainloop()
gehts.

Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kann es sein, dass Tk unbedingt ein X11-Screen braucht, onabhängig davon, ob es benutzt wird oder nicht?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Leonidas hat geschrieben:Kann es sein, dass Tk unbedingt ein X11-Screen braucht, onabhängig davon, ob es benutzt wird oder nicht?
Ich weiss nicht was das ist, aber wenn ich das Script von einem anderen Script außerhalb vom Apache/CGI aufrufe, klappts.

Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann wirds wohl etwas anderes sein. Was steht denn im error.log?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Ein einziger Aufruf hinterläßt einen kleinen Roman im error.log des Apachen:

Code: Alles auswählen

[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] Traceback (most recent call last):, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1]   File "/srv/www/cgi-bin/fenster.py", line 6, in ?, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1]     , referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] haupt =  Tk(), referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1]   File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1569, in __init__, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1]     , referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use), referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] _tkinter, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] ., referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] TclError, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] : , referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] no display name and no $DISPLAY environment variable, referer: http://localhost/merge/Test.Html
[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] , referer: http://localhost/merge/Test.Html
Gruss, Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann liegt es doch daran, dass der Server nicht auf X11 zugreifen kann. Ja, so ist das mit Tk, es braucht eine grafische Oberfläche.
Entweder du kannst auf deinem Server einen X-Server starten und dem Webserver-User zugriff darauf gewähren, oder du suchst dir eine Soundlib, die keine grafische Oberfläche braucht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:

Code: Alles auswählen

[Wed Mar 22 05:15:10 2006] [error] [client 127.0.0.1] no display name and no $DISPLAY environment variable, referer: http://localhost/merge/Test.Html
Hi Seven!

In erster Linie bedeutet das zuerst mal, dass Tkinter nicht weiß wohin es ein Fenster zeichnen soll. Dabei spielt es wahrscheinlich keine Rolle, ob auch wirklich ein Fenster gezeichnet wird oder nicht.

Es sucht nach der Umgebungsvariable "DISPLAY", die normalerweise angibt, welches Display für grafische Ausgaben zuständig ist. Das ist normalerweise ":0.0".

Jetzt kann es sein, dass Tkinter schon damit zufrieden ist, wenn du ihm diese Variable mit dem oben gezeigten Wert befüllst. Es kann aber auch sein, dass Tkinter dort auch einen funktionierenden X-Server sucht. Falls es durch Angabe von DISPLAY funktioniert, musst du aber auch ausprobieren, ob das Skript noch funktioniert, wenn du ihm die grafische Oberfläche nimmst. Auf einem Webserver hast du normalerweise keinen laufenden X-Server im Hintergrund. Das könnte man aber sicher irgendwie arrangieren.

Aber bevor das alles wichtig wird, würde ich erst mal testen, ob es mit der Angabe der Umgebungsvariable DISPLAY funktioniert.

Vielleicht muss man den Benutzer, unter dem der Apache läuft, auch noch einer Gruppe mit mehr Rechten zuweisen. Das ist aber SUSE-spezifisch, deshalb kann ich dir da keine Auskunft geben.

In einem Python-Skript kannst du die Umgebungsvariable mit os.environ["DISPLAY"] = ":0.0" setzen. Ich denke mal, dass es nicht schlecht wäre, diese Variable schon vor dem Importieren von Tkinter zu setzen.

Dann kommt es darauf an, welchen Fehler du als nächstes bekommst.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

normalerweise darf doch nicht mal root ohne entsprechende Erlaubnis des Users "eifnach so" auf den X-Server zugreifen. Und einen Webserver mit laufendem X?

Wärs da nicht eleganter, einfach die Sounds anderweitig abzuspielen? Notfalls einfach mplayer o.Ä. aufrufen?
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Irgendwie muss der Mond falsch stehen oder so, jedenfalls bin ich zur Zeit wohl etwas schwer von Begriff. Was willst Du denn eigentlich machen?
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

tiax hat geschrieben:normalerweise darf doch nicht mal root ohne entsprechende Erlaubnis des Users "eifnach so" auf den X-Server zugreifen.

Code: Alles auswählen

xhost +
*duck*
tiax hat geschrieben:Und einen Webserver mit laufendem X?
Natürlich, sowas sollte man nicht machen, da es einfach total überflüssig ist und im besten Fall nur stört.
tiax hat geschrieben:Wärs da nicht eleganter, einfach die Sounds anderweitig abzuspielen? Notfalls einfach mplayer o.Ä. aufrufen?
Ich habe mir schon gedacht, das eine Soundbibliothek mit Tk zu verknüpfen eine dämliche Idee ist. Deswegen bevorzuge ich da schon pysonic (baut leider auf unfreiem FMOD auf) oder gst-python (das ist gut, nur nicht unter Windows, schade eigentlich).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

N317V hat geschrieben:Irgendwie muss der Mond falsch stehen oder so, jedenfalls bin ich zur Zeit wohl etwas schwer von Begriff. Was willst Du denn eigentlich machen?
Hallo,
es geht nicht einfach ums Soundabspielen, da gäbe es genug andere Möglichkeiten.
Es geht um eine Applikation, die Anforderungen übers Web entgegen nimmt, Audiobearbeitungen durchführt und das Ganze dann als MP3 versendet, bzw. aufs Handy funkt. Unter Windoof funktioniert das ja auch alles, aber ich muß auch eine Linuxversion davon haben, schon aus Gründen der wesentlich günstigeren Server. Im Moment laufen die Scripte zur Audiobearbeitung threadgesteuert und warten auf Anfragen. Eleganter wäre es, die jeweiligen Module nur bei Bedarf aus dem CGI-Script heraus aufzurufen und dann wieder zu terminieren, bzw. die Programmteile komplett ins CGI zu packen. Und das hapert an Snack, weil es komplett auf Tkinter angewiesen ist. Ohne Snack geht es aber nicht.

Gruss, Seven
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

gerold hat geschrieben:In einem Python-Skript kannst du die Umgebungsvariable mit os.environ["DISPLAY"] = ":0.0" setzen. Ich denke mal, dass es nicht schlecht wäre, diese Variable schon vor dem Importieren von Tkinter zu setzen.

Dann kommt es darauf an, welchen Fehler du als nächstes bekommst.

lg
Gerold
:-)
Der nächste Fehler folgt auf dem Fuße :D

Code: Alles auswählen

[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Xlib: connection to ":0.0" refused by server\r
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Xlib: 
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] No protocol specified
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] \r
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Traceback (most recent call last):
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1]   File "/srv/www/cgi-bin/fenster.py", line 7, in ?
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1]     
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] haupt =  Tk()
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1]   File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1569, in __init__
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1]     
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] _tkinter
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] .
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] TclError
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] : 
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] couldn't connect to display ":0.0"
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] 
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Premature end of script headers: fenster.py
Das dazugehörige Script im Apache ausgeführt:

Code: Alles auswählen

#!/usr/bin/python2.4
import time,string,os,sys,popen2,subprocess
os.environ["DISPLAY"] = ":0.0"
from Tkinter import Tk
from tkSnack import Sound,initializeSnack

haupt =  Tk()
initializeSnack(haupt)

haupt.mainloop()
Gruss,Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:Der nächste Fehler folgt auf dem Fuße :D

Code: Alles auswählen

[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Xlib: connection to ":0.0" refused by server\r
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] Xlib:
[Mon Mar 27 20:50:10 2006] [error] [client 127.0.0.1] No protocol specified
Hi Seven!

Das gehört zu den Probleme, vor denen ich dich am Anfang gewarnt habe. Von wegen Mischen von GUI- und Internetanwendung. Da es für deine Anwendung kein Zurück und keine Alternativen gibt, hast du nur zwei Möglichkeiten.

1. Du verwendest einen Windows-Server und sparst dir dadurch eine Menge Lernaufwand und Entwicklungskosten, da deine Anwendung ja schon unter Windows läuft.

2. Du bleibst bei Linux und befasst dich mit Apache, X-Server, Berechtigungen usw.

Für den zweiten Fall, kann ich im Moment nur mit Hinweisen dienen, da ich kein Suse habe und auch nicht so viel Zeit zum Probieren in die Sache invenstieren möchte.

Hier mal ein allgemeiner Link zum Thema CGI unter Apache. Interessant dürfte der Absatz über **Suexec** sein. Ob es das aber auch unter der Apache-Version gibt, die bei Suse läuft, dass musst du selber nachschlagen. http://httpd.apache.org/docs/2.2/howto/cgi.html

Dann möchte ich dich auch noch auf ein mögliches Timeout des Apachen hinweisen. Es könnte sein, dass der Apache länger laufende CGI-Programme einfach abbricht. Das musst du unbedingt austesten, bevor der Echtbetrieb los geht.

Das Problem das du mit **Tkinter** hast haben andere auch. Vielleicht findest du eine Anleitung im Internet. Du bist nicht der erste, der eine GUI-Anwendung über das WWW bedienen möchte. Ich habe schon von Fällen gehört, da wurde der Browser Firefox, OpenOffice und grafische Tools zum Erstellen von PDF über das WWW bedient. Es ist also nicht unmöglich.

Du musst es nur schaffen, einen X-Server zu starten und dem Apachen die Berechtigung zu geben auf diesem X-Server einen X-Client wie z.B. deine Tkinter-Anwendung laufen zu lassen. Nicht nur die Berechtigungen sondern auch die dafür benötigten Umgebungsvariablen müssen gesetzt sein.

Falls du es nicht mit xauth hin bekommst, dann lass dich nicht zu sehr von den Aussagen des ersten Links abschrecken. xhost ist nicht unbedingt unsicher, wenn nur du alleine auf dem Computer arbeiten darst. Ich schätze die Gefahr von xhost in deinem Fall als extrem gering ein.

Hier noch ein paar wichtige Links zu diesem Thema:
http://www.theparallax.com/dcoul/user2root/xhost.shtml
http://www.tu-berlin.de/~pophal/kurse/X/xhost-text.html
http://www.tu-berlin.de/zrz/information ... x11-3.html

Hilfe bekommst du zu diesem Thema wahrscheinlich auch in den bekannten Linux-Newsgroups.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi Gerold,
ein großes Danke (!) für die ausführliche Antwort.
Werde mich auf jeden Fall mit der Materie beschäftigen, weil ich die Telefonie in Zukunft über Asterisk machen will (mehrere Kanäle parallel) und der läuft auf jedem Linux-Server. Wenn ich das mit dem X-Server nicht hinkriegen sollte, muss ich mir eben einen Anbieter suchen, der mir unbegrenzte Ausführungszeit für meine Scripte genehmigt, die laufen dann eben permanent außerhalb des Apachen und warten auf Aufträge (so wie schon unter Windows/ Zope). Ich lerne nur auch gerne dazu und will alles optimieren und da werden mir deine Links sicherlich wieder bei helfen !

Viele Grüße, Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snakeseven hat geschrieben:Ich lerne nur auch gerne dazu und will alles optimieren und da werden mir deine Links sicherlich wieder bei helfen !
Sowas liest man gerne, echt. Wenn man sich in letzter Zeit die Anzahl Lern- und Denkresistenter Leute ansieht, dann ist sowas wie ein kleiner Sieg :D

Wenn du Hilfe brauchst, dann kannst du ggf. auch ins Debianforum schauen, die Leute sind meist nett wenn man nett fragt und hilfreich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Ja, Denkresistenz ist ein weit verbreitetes Phänomen :wink:
Für mich ist die Beschäftigung mit neuen Themen soetwas wie Brainjogging. Wenn ich resümiere, wieviel ich in diesem Forum das letzte halbe Jahr gelernt habe, dann ist das wirklich enorm und ich hoffe, dass ich das irgendwann mal zurückgeben kann !

Gruss, Seven
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

So, jetzt habe ich es erstmal mit '/usr/X11R6/bin/xhost +localhost' probiert und es wurde auch bestätigt, daß 'localhost' der access control list hinzu gefügt wurde. Apache wurde neu gestartet, doch leider hat es das Problem nicht gelöst. Die Variable $DISPLAY scheint unbekannt !? (Habe xhost daher erstmal wieder deaktiviert)

Code: Alles auswählen

[Sat Nov 23 14:53:08 2002] [error] [client 127.0.0.1] no display name and no $DISPLAY environment variable
[Sat Nov 23 14:53:08 2002] [error] [client 127.0.0.1] 
[Sat Nov 23 14:53:08 2002] [error] [client 127.0.0.1] Premature end of script headers: fenster.py
Gruss, Seven
BlackJack

Der Apache säubert beim Start recht gründlich die Umgebungsvariablen. Hast Du schon versucht das DISPLAY wieder zu der Umgebung hinzuzufügen?
Antworten