Seite 1 von 1

exec funktioniert nicht

Verfasst: Donnerstag 14. Juli 2005, 07:41
von Anonym
Ich brauche für mein Programm das exec-Statement, da der User selber etwas programmieren können soll. Und da es nur eine Test-Version ist, ist es auch egal das dadurch Sicherheitslücken entstehen.
Zum eigentlichen Problem:
Wenn ich exec benutze bekomme ich immer folgende Fehlermeldung:
"Could not execute because an error occurred:
SyntaxError: unqualified exec is not allowed in function 'ExecuteScript' it contains a nested function with free variables"

Ausser wenn ich exec nicht in eine Funktion einbinde kommt diese Meldung nicht. Aber wenn ich nicht in eine Funktion einbinden kann, dann kann ich es ja auch nicht aufrufen. Also was mache ich falsch?

Verfasst: Donnerstag 14. Juli 2005, 07:45
von jens
Zeig mal dein skript her...

Verfasst: Donnerstag 14. Juli 2005, 08:04
von Gast
Ich habe noch nicht viel programmiert, da ich dieses exec zuerst mal testen wollte.

Code: Alles auswählen

def ExecuteScript(Script):
    try:
        exec Script #Script ist ein String
    except:
        pass
Und da kommt dan halt die Fehlemeldung.

Verfasst: Donnerstag 14. Juli 2005, 08:09
von jens
Also bei mir geht's mit ExecuteScript("print 'Hello World!'")

Ich würde es evtl. aber so machen:

Code: Alles auswählen

def ExecuteScript(Script):
    try:
        exec Script #Script ist ein String
    except Exception,e:
        print "ERROR:",e


ExecuteScript("print 'Hello World!'")
Dann sieht man auch Fehlermeldungen...

Verfasst: Donnerstag 14. Juli 2005, 08:50
von Gast
Jetzt gehts bei mir auch. Hatte die Funktion in eine Klasse eingebaut und zu wenig eingerückt. Aber aufgrund der Fehlermeldung habe ich den Fehler natürlich bei exec gesucht und nicht bei der Einrückung. Das Mit den Fehlermeldungen wollte ich sowieso noch einbauen aber bevor ich mir die Arbeit mache, wollte ich sehen ob es überhaupt funktioniert.
Vielen Dank für die Hilfe.

Verfasst: Donnerstag 14. Juli 2005, 09:21
von Gast
Hallo ich bins nochmal.
Wie kann ich in einem exec-Statement auf eine Funktion zugreifen, die ich ausserhalb von exec definiert habe? Kann ich da irgendwas übergeben so wie bei eval oder was muss ich da machen?

Verfasst: Donnerstag 14. Juli 2005, 13:33
von CM
Wie wäre es mit einer simpelen import Funktion am Anfang des auszuführenden Skriptes?

Aber sag mal: Jens hat schon recht, wenn er Beispielcode (oder eine Beschreibung einfordert). Sonst rät man ja nur rum.

Gruß,
Christian

Verfasst: Donnerstag 14. Juli 2005, 16:19
von Gast
Es ging ja nur darum wie dass man das mit exec macht. Mit eval kann ich es so machen eval('Audruck', globals, locals). Ich habe aber nicht herausgefunden wie das mit exec geht, da es so schlecht dokumentiert ist. Habe es inzwischen rausgefunden exec code in globals, locals. Dann kann ich meine Funktion in globals oder locals übergeben.
Für diese Frage machte es in meinen Augen keinen Sinn Code von mir zu posten, da es ja um die grundsätzliche Funktionalität von exec ging. Aber Haupsache ich habs jetzt. Danke für eure Hilfe.

Verfasst: Donnerstag 14. Juli 2005, 16:53
von jens
Eine dumme Frage zurück... Worin liegt denn der Unterschied zwischen exec und eval???

Verfasst: Donnerstag 14. Juli 2005, 22:09
von BlackJack
`exec` ist ein Schlüsselwort mit dem man beliebigen Code ausführen kann und `eval` ist eine Funktion und der Code muss ein Ausdruck sein, dessen Ergebnis als Rückgabewert von `eval` dient. `eval` hat ähnliche Beschränkungen wie ``lambda``, zum Beispiel geht das hier nicht: ``eval('print "hallo"')``.