Zope kennt Subprocess nicht ?

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Zope kennt Subprocess nicht ?

Beitragvon snakeseven » Freitag 16. Dezember 2005, 13:05

Hallo,
eine Externe Methode soll das Subprocess-Modul aufrufen, um den Lame-Encodierer damit zu starten. Jetzt kennt das Zope-Python aber das Modul subprocess nicht ?

An error was encountered while publishing this resource.

Error Type: ImportError
Error Value: No module named subprocess


Naive Frage:
Ist es möglich, Zope so zu konfigurieren, daß er nicht sein eigenes Python verwendet, sondern das des Interpreters mit allen dort verfügbaren Modulen ?

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

Re: Zope kennt Subprocess nicht ?

Beitragvon gerold » Freitag 16. Dezember 2005, 13:17

snakeseven hat geschrieben: eine Externe Methode soll das Subprocess-Modul aufrufen, um den Lame-Encodierer damit zu starten. Jetzt kennt das Zope-Python aber das Modul subprocess nicht ?

Hi Seven!

Kein Problem. Kopiere einfach das Modul "subprocess.py" von deiner Python 2.4-Installation in den Ordner, in dem du deine externen Methoden hast.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 16. Dezember 2005, 13:21

Hehe, was hast du denn vor???

subprocess ist erst bei Python v2.4 dabei...

Ist aber kein Problem. Du kannst es einfach bei einem älteren Python nachrüsten. Dazu packst du subprocess.py aus einem 2.4er, deinem Skript bei.
Schau dir das mal an: http://pythonwiki.de/PythonTipps/Neuere ... fb735cf6b4

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Freitag 16. Dezember 2005, 19:57

Danke für eure Hilfe, werde es am WE gleich ausprobieren !
Dann gleich eine weitere Frage: Außer 'subprocess' kennt Python Zope auch Tkinter und tkSnack nicht.

Code: Alles auswählen

from Tkinter import *
from tkSnack import *
from email.MIMEAudio import MIMEAudio
from email.MIMEMultipart import MIMEMultipart
import threading,time,sys,cPickle,string, popen2, subprocess, smtplib


Ich weiss, Tkinter in Zope hört sich bekloppt an, aber 'tkSnack', das Audiobearbeitungs-Modul arbeitet ohne 'Tkinter' nicht. Die Snack Bibliothek liegt in .../Python24/tcl und tkSnack.py in ../Python24/Lib/. Was wären die equivalenten Verzeichnisse in Zope ? Oder einfach auch in Zope-Extensions kopieren ?

Gruss, Seven

@Jens: Lame ist nur eine Zwischenlösung. Sicherlich gibt es auch Möglichkeiten einen MP3-Encoder direkt in Python zu integrieren. Aber so läuft es ja erstmal
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 16. Dezember 2005, 22:45

snakeseven hat geschrieben:Ich weiss, Tkinter in Zope hört sich bekloppt an, aber 'tkSnack', das Audiobearbeitungs-Modul arbeitet ohne 'Tkinter' nicht. Die Snack Bibliothek liegt in .../Python24/tcl und tkSnack.py in ../Python24/Lib/. Was wären die equivalenten Verzeichnisse in Zope ? Oder einfach auch in Zope-Extensions kopieren ?

Gruss,

Hi Seven!

Vielleicht kannst du unterhalb des Ordners der "Externen Methoden" die TkInter-Dateien mit der gleichen Ordnerstruktur, wie im Python-Ordner hinein kopieren. Das müsste man ausprobieren. Vielleicht geht es auch, wenn du wie weiter unten beschrieben, die Dateien in den Python-Ordner von Zope kopierst.

In einer externen Methode kannst du mit

Code: Alles auswählen

return sys.path
heraus finden, welche Ordner Module enthalten können.

Mit

Code: Alles auswählen

sys.path.append("irgendeinpfad")
kannst du irgend einen Ordner zum Python-Pfad der Zope-Instanz hinzufügen. Das kannst du immer tun, bevor du ein Modul aus einem Ordner importieren möchtest, der noch nicht im Python-Pfad ist.

Bedenke: Zope läuft intern mit Python 2.3.x. Welche Version es genau ist, findest du über das ZMI im "Control_Panel" heraus. Ich glaube es wird Python 2.3.5 verwendet. Wenn du also Tkinter importieren möchtest, dann sollte dieses TkInter auch für diese Python-Version auf deinem Computer existieren. Dafür müsstest du aber auch ein zweites Python auf deinem Computer installieren. Am Besten wird es wohl sein, vorher Python 2.4 zu deinstallieren, dann 2.3.x installieren und danach wieder 2.4 drauf. Dann hast du 2.4 als Standard-Python und auf Python 2.3.x kannst du auch zugreifen. Was dich sonst noch für Überraschungen erwarten, weiß ich nicht.

Ich habe derzeit kein Zope unter Windows laufen. Unter Linux wäre der Python-Ordner "lib/python".

Vielleicht weiß hier jemand, welche Ordner und Dateien nötig sind, damit TkInter funktioniert. So wie ich das verstehe, brauchst du ja keine grafische Oberfläche. Vielleicht funktioniert es mit den Dateien aus Python2.4. Wenn nicht, dann könnte es, wie oben bereits beschrieben, mit den Dateien aus einer Python 2.3-Installation funktionieren.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Sonntag 18. Dezember 2005, 12:42

Hallo Gerold,
Also, das mit sys.path.append() scheint zu klappen. Jedenfalls bekomme ich beim Initialisieren meiner externen Methode keine Fehlermeldung mehr. Dafür aber beim Ausführen:

name 'Tk' ist not defined


Meine externe Methode sieht eingangsmäßig so aus, wie unten zu sehen. Von da aus wird zu weiteren Funktionen verzweigt. Mein Problem ist, daß ich im Interpreterscript den ganzen Code in den Loop:

Code: Alles auswählen

root =  Tk()
initializeSnack(root)
# *** Programm Rumpf***
root.mainloop()


gepackt habe, ich aber nicht weiss, wie ich das in einer externen Methode machen soll ? Aber hier erstmal meine Eingangsroutine Lookat():

Code: Alles auswählen

def Lookat(self):
    import sys
    sys.path.append("C:/Programme/Python24/tcl/")
    sys.path.append("C:/Programme/Python24/tcl/snacklib/")
    sys.path.append("C:/Programme/Python24/Lib/")
    import cPickle,string, popen2, subprocess, smtplib

    from Tkinter import *
    from tkSnack import *
    from email.MIMEAudio import MIMEAudio
    from email.MIMEMultipart import MIMEMultipart

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

    class globelvars:                # globale Variablen         
        take1 = '-----'
        take2 = '-----'
        mess = ''
        email = ''
        music = ''
        filename = ''
        path_take1 = ''
        path_take2 = ''
        path_mess = 'G:/audiozeugs/artist/spoken/'
        path_music = 'G:/audiozeugs/artist/music/'
        path_save = 'G:/audiozeugs/test/'
   
    gv = globelvars()

    wavtake1 = Sound()         # Snack-Objekt
    wavtake2 = Sound()
    wavmess = Sound()
    musicfile = Sound()
    tempsnd = Sound()
   
    gv.mess = self.REQUEST.selectMess
    gv.take1 = self.REQUEST.selectTake[0]
    gv.take2 = self.REQUEST.selectTake[1]
    gv.music = self.REQUEST.selectMusik
    gv.email = self.REQUEST.selectEmail
    gv.take1 = gv.take1[1:]     
    gv.take2 = gv.take2[1:]
    update_takes()


Übrigens, 'subprocess' in den 'extensions' Ordner von der Zope-Instanz zu kopieren, hat nichts gebracht. Auch eine Kopie der Ordnerstruktur vom Pythoninterpreter innerhalb Zopes war erfolglos. Nur mit sys.path.append() scheints zu gehen.

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

Beitragvon snakeseven » Sonntag 18. Dezember 2005, 13:26

Ergänzung:
Also, das Reinladen der externen Methode funktioniert nach wie vor, aber wenn ich den 'Test' Button drücke, kennt er wieder 'subprocess' nicht. Blöd, genauso weit wie vorher. :cry:

Wenn ich 'Lookat' aus einem HTML Document aus aufrufe, bekomme ich eine andere Fehlermeldung (name 'Tk' unknown).

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

Beitragvon gerold » Sonntag 18. Dezember 2005, 19:23

snakeseven hat geschrieben:Also, das Reinladen der externen Methode funktioniert nach wie vor, aber wenn ich den 'Test' Button drücke, kennt er wieder 'subprocess' nicht. Blöd, genauso weit wie vorher. :cry:

Wenn ich 'Lookat' aus einem HTML Document aus aufrufe, bekomme ich eine andere Fehlermeldung (name 'Tk' unknown).

Hi Seven!

Tu dir einen Gefallen und trenne Zope und GUI-Funktionen. Schreibe dir einen kleinen XMLRPC-Server oder einen TCP-Server, starte diesen unabhängig von Zope und steuere diesen Server mit kleinen Nachrichten.

Andererseits -- du hattest ja schon eine einfache Trennung mit Textdateien. Was ist dabei schief gegangen? Es wäre doch ziemlich einfach, in einem gemeinsamen Ordner kleine Textdateien mit "Anweisungen" zu hinterlegen. Diese sperrst du während der Erstellung mit Lock-Dateien, so dass kein anderes Programm rein pfuscht. Diesen Ordner untersuchst du alle paar Sekunden nach neuen Anweisungen.

Als Dateinamen nimmst du am Besten "time.time()". Dann hast du ja schon die Reihenfolge, in der die Befehle abgearbeitet werden sollen.

Von Zope (Externe Methode) aus:
1. Mit time.time() den Dateinamen eruieren.
2. Prüfen ob die Datei oder deren Lockdatei schon existieren. Wenn Ja - noch einmal von vorne beginnen und neuen Namen ermitteln.
2. Lockdatei für die Datei erstellen
3. Datei erstellen und Anweisung rein schreiben.
4. Lockdatei löschen.

Steuerprogramm (Mini-Serverprogramm):
1. Alle Dateien des gemeinsamen Ordners auslesen (z.B. mit glob.glob())
2. Dateien die eine Lockdatei besitzen, wieder aus der Liste löschen
3. Liste mit Dateinamen sortieren
4. Die Datei mit den ältesten Anweisungen mit einer Lockdatei sperren.
5. Die Anweisung ausführen
6. Die Datei mit den Anweisungen löschen
7. Lockdatei löschen.
8. time.sleep(1) (je nach Dringlichkeit)
9. Schleife beginnt von vorne.

Die Vorteile dieser Methode:
- Trennung von Zope und GUI
- Zope ist sofort wieder Verfügbar, auch wenn das Serverprogramm noch Minuten lang arbeitet -- Zope wird nicht daran gehindert, weitere Anforderungen entgegen zu nehmen.
- Das Server-Programm kann alle Funktionen von Python 2.4 uneingeschränkt nutzen.
- etc.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Beitragvon snakeseven » Montag 19. Dezember 2005, 00:57

Hallo Gerold,
erstmal danke für deine Anregungen. Das mit der Lockdatei könnte mich auf jeden Fall weiterbringen. In der Tat mache ich es z.Zt. so, daß die externe Methode lediglich ein Textfile mit den eingehenden Anforderungen erstellt. Im Interpreter läuft das eigendliche Programm, welches Thread-gesteuert die Anforderungen abarbeitet und einen Zähler hochzählt. Da aber in der finalen Version mehrere Anforderungen parallel bearbeitet werden sollen und ich die Resourcen nicht mit unnötigen Threads verschwenden will, wünsche ich mir eine effektivere Lösung. Die Lockdatei wird zumindest dafür sorgen, daß die verschiedenen Anforderungen sich nicht in die Quere kommen. Mehrere Scripte können ja parallel laufen, das ist kein Problem. Ich schätze eben 'elegante' Lösungen, da bin ich dann gerne Ästhet :) Abert so kann es auch gehen. Da nur ein Lame z.Zt. schaffen kann, wird es echtes Multitasking eh nicht geben.

Gruss, Seven

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder