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: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. März 2006, 15:05

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

Dienstag 28. März 2006, 17:04

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

Dienstag 28. März 2006, 19:11

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: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Dienstag 28. März 2006, 20:31

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

Mittwoch 29. März 2006, 06:45

Der Apache säubert beim Start recht gründlich die Umgebungsvariablen. Hast Du schon versucht das DISPLAY wieder zu der Umgebung hinzuzufügen?
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Freitag 31. März 2006, 16:47

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:

Freitag 31. März 2006, 17:36

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:

Samstag 1. April 2006, 07:53

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: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Sonntag 2. April 2006, 19:30

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