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

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

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

Beitragvon snakeseven » Dienstag 21. März 2006, 17:46

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

[code=]args = []
os.execv("/srv/www/cgi-bin/fenster.py",args)[/code]
bzw:
[code=]p = subprocess.Popen("/srv/www/cgi-bin/fenster.py",shell=True)[/code]

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 21. März 2006, 17:49

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

Beitragvon snakeseven » Dienstag 21. März 2006, 18:51

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=]root = Tk()
initializeSnack(root)
root.mainloop()[/code]

gehts.

Seven
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 21. März 2006, 19:01

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 Modvoice
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Dienstag 21. März 2006, 22:05

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 21. März 2006, 22:15

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

Beitragvon snakeseven » Mittwoch 22. März 2006, 06:33

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

[code=][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[/code]
Gruss, Seven
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 22. März 2006, 15:52

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 Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 22. März 2006, 20:52

snakeseven hat geschrieben:[code=][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[/code]

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:

Beitragvon tiax » Donnerstag 23. März 2006, 16:01

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
xmpp:florian@florianheinle.de
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Donnerstag 23. März 2006, 16:12

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 23. März 2006, 16:40

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

[code=]xhost +[/code] *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 Modvoice
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Montag 27. März 2006, 12:41

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
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Montag 27. März 2006, 21:03

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=][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[/code]

Das dazugehörige Script im Apache ausgeführt:

[code=]#!/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()[/code]

Gruss,Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 28. März 2006, 09:08

snakeseven hat geschrieben:Der nächste Fehler folgt auf dem Fuße :D
[code=][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[/code]

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder