Externe Skripts hinzufügen. Probleme mit dem Kontext

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hanse
User
Beiträge: 2
Registriert: Samstag 10. Mai 2008, 15:36

moin
Ich will es dem Benutzer erlauben meine Software mit hilfe von Skripts zu steuern. Dabei will ich aber nur, dass die Skripts auf ein einzige Variable zugreifen können. Ich habe das versucht so zu lösen:

Code: Alles auswählen

from twisted.internet import defer

class scriptEngine:
    """
    The scripting engine. Communicates with the user scripts.
    """
    __shared_state  = {}
    __loaded        = 0

    scriptPath = ""
    callbackIndex={}
    processQueue=[]
    scriptnamespace={}

    def __init__(self):
        self.__dict__=self.__shared_state
        if not self.__loaded:            
          self.scriptnamespace={'secs':self}
          self.__loaded=1

    def reloadScripts(self):
        """ Reloads the user scripts """
        self.callbackIndex={}
        execfile(self.scriptPath,self.scriptnamespace)

    def addCallback(self,agent,job,port=-1,processid=-1):
        # Viele weitere Funktionen auf die der Benutzer zugreifen kann
Die Funktion reloadScripts() wird irgendwann von meiner Software ausgeführt. Das Funktioniert auch ganz gut allerdings kann das Skript Callbacks erstellen die aber zum Teil Variablen verwenden die im Skript Global sind (ich hoffe ich drücke mich richtig aus).
z.B. So:

Code: Alles auswählen

print "Testskript 03"

var=-1

def pongCallback(data):
    print var
    var += 1
    secs.addCallback(1,"CORE-PING").addCallback(pongCallback)

secs.addCallback(1,"CORE-PING").addCallback(pongCallback)
Hier erhalte ich:
exceptions.UnboundLocalError: local variable 'var' referenced before assignment
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die Funktion "pongCallback" muss einen Befehl `global var` enthalten. Dann sollte es auch mit dem Ändern globaler Variablen klappen. Lesen kann man sie zwar, aber schreiben nicht.

Stefan
hanse
User
Beiträge: 2
Registriert: Samstag 10. Mai 2008, 15:36

Danke
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich glaube nicht. Globale Variablen deklarieren zu müssen ist eine Eigenheit von Python. Was du machen kannst, diese alle als Attribute eines globalen Objekts aufzufassen, also

Code: Alles auswählen

def inc_var():
    G.var += 1
Nun ist "G" global, aber nur lesend und daher kein Problem für Python. Du könntest das hinter einer Variante von Python, die etwa `$var` statt `G.var` benutzt verstecken.

Stefan
Antworten