Seite 1 von 1

Externe Skripts hinzufügen. Probleme mit dem Kontext

Verfasst: Samstag 10. Mai 2008, 16:03
von hanse
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

Verfasst: Samstag 10. Mai 2008, 19:21
von sma
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

Verfasst: Samstag 10. Mai 2008, 19:51
von hanse
Danke

Verfasst: Samstag 10. Mai 2008, 19:57
von sma
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