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:

BlackJack hat geschrieben:...Hast Du schon versucht das DISPLAY wieder zu der Umgebung hinzuzufügen?
Kannst du mir kurz erklären wie das geht ? Habe in der Doku nichts dazu gefunden !?
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:
BlackJack hat geschrieben:...Hast Du schon versucht das DISPLAY wieder zu der Umgebung hinzuzufügen?
Kannst du mir kurz erklären wie das geht ? Habe in der Doku nichts dazu gefunden !?
Hi Seven!

os.environ["DISPLAY"] = ":0.0" funktioniert nicht?

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Seven!

Ich habe ein wenig experimentiert. Leider bekomme ich Snack nicht zum Laufen. Es schreibt mir bei "initializeSnack(root)" immer irgendetwas wie "can't find package snack". Auch wenn ich es nicht in einem CGI-Skript ausprobiere. Aber egal. Zumindest habe ich es geschaft ein Tkinter-Fenster von einem CGI-Skript aus anzuzeigen.

Hinweis: Ich verwende Gentoo-Linux. Deshalb kannst du nicht unbedingt davon ausgehen, dass es unter Suse exakt gleich funktioniert.

Zuerst habe ich Gentoo gestartet und mich an die grafische Oberfläche Gnome angemeldet. Du wirst unter Suse wahrscheinlich KDE verwenden. Das sollte aber keinen Unterschied machen. Warum ich das schreibe? Weil es eventuell für die Verwendung von "xhost" wichtig ist.

Dann startete ich ein Terminal und habe als normaler Benutzer (also nicht root) "xhost +" eingegeben. (Dessen Unsicherheit ist mir bewust. Meine Shorewall-Firewall ist dicht genug.)

Dann habe ich mein Apache so eingerichtet, dass CGI-Skripte im Ordner /home/gerold/public_html ausgeführt werden. Das habe ich noch schnell mit einem kleinen Testskript getestet. --> funktionierte einwandfrei.

Falls es jemanden interessiert. Das ist der Block, den ich leicht angepasst habe:

Code: Alles auswählen

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
# enable by adding -D USERDIR to /etc/conf.d/apache2
#
<IfModule mod_userdir.c>
    UserDir public_html

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        <Limit GET POST OPTIONS PROPFIND>
            Order allow,deny
            Allow from all
       </Limit>
       <LimitExcept GET POST OPTIONS PROPFIND>
            Order deny,allow
            Deny from all
       </LimitExcept>
    </Directory>


# Enable this additional section if you would like to make use of a
# suexec-enabled cgi-bin directory on a per-user basis.
#
#<Directory /home/*/public_html/cgi-bin>
#    Options ExecCGI
#    SetHandler cgi-script
#</Directory>

<Directory /home/*/public_html/>
    Options ExecCGI
    SetHandler cgi-script
    AddHandler cgi-script .py
</Directory>


</IfModule>
Dann habe ich mich an das CGI-Skript gemacht, das auf Tkinter zugreifen soll.
Nach ein paar Fehlermeldungen habe ich dieses Testskript ausgearbeitet (Ach ja, bevor ich es vergesse. Mein System läuft unter utf-8. Wenn deines unter einem anderen Coding läuft, dann würde ich die Angabe des Codings anpassen.):

Code: Alles auswählen

#!/usr/bin/python2.4
# -*- coding: utf-8 -*-

print "Content-Type: text/html"
print

import cgi
import cgitb; cgitb.enable()

import sys
import os
os.environ["DISPLAY"] = ":0.0"

from Tkinter import Tk
from tkSnack import Sound,initializeSnack

root =  Tk()
#initializeSnack(root) # geht bei mir nicht

# Kopf
print \
"""<html>
<head>
</head>
<body>
"""

print "<p>Jetzt sollte das Fenster aufgehen</p>"
sys.stdout.flush() # Damit die Ausgabe jetzt angezeigt wird."

root.mainloop()

print "<p>Das Fenster wurde geschlossen</p>"

# Fuss
print \
"""
</body>
</html>
"""
Das dürfte als Testumgebung genügen.

Was dir aber noch bevor steht: Du musst das Ganze dann auf einem Internet-Server zum Laufen bekommen, an den du dich nicht so einfach an die grafische Oberfläche anmelden kannst.

Das heißt, du musst dich dann darum kümmern, dass auf dem Internet-Server, beim Starten, ein X-Server gestartet wird und dieser X-Server vom Benutzer, unter dem der Apache ausgeführt wird, verwendet werden kann. Du brauchst kein KDE oder Gnome. Der X-Server alleine sollte reichen. Das ist dann aber keine Python-Geschichte mehr. Damit bist du auf die Hilfe von erfahrenen Linux-Benutzern angewiesen.

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:

Hallo Gerold,
wiedereinmal VIELEN DANK (!) für deine sehr ausführliche Hilfe. Ich habe es genauso gemacht wie du, aber wenn ich das Script außerhalb des Apachen starte, bekomme ich die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 17, in ?
    root =  Tk()
  File "/usr/lib/python2.4/lib-tk/Tkinter.py", line 1569, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
TclError: couldn't connect to display ":0.0
Innerhalb des Apachen gestartet werde ich gefragt, ob ich das Script mit einem Texteditor öffnen will ??

Ich glaube ich lasse es bei der jetzigen Version mit Tkinter. Wenn ein Provider es nicht mögen sollte, daß die Scripte permanent in Asuführung sind (auch wenn sie die meiste Zeit nur warten), kann ich ja einbauen, daß sie nach einer bestimmten Zeit terminieren, um sich dann wieder erneut zu starten :wink: . Sparsam im CPU-Verbrauch sind die kleinen Helferlein eh, am meisten Perfomance braucht der LAME und der wird ja wirklich nur gestartet, wenns was zu Kompromieren gibt.

Viele Grüße, Seven
Antworten