exec funktioniert nicht

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
Anonym

Donnerstag 14. Juli 2005, 07:41

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?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 14. Juli 2005, 07:45

Zeig mal dein skript her...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Donnerstag 14. Juli 2005, 08:04

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 14. Juli 2005, 08:09

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Donnerstag 14. Juli 2005, 08:50

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.
Gast

Donnerstag 14. Juli 2005, 09:21

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?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 14. Juli 2005, 13:33

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
Gast

Donnerstag 14. Juli 2005, 16:19

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 14. Juli 2005, 16:53

Eine dumme Frage zurück... Worin liegt denn der Unterschied zwischen exec und eval???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Donnerstag 14. Juli 2005, 22:09

`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"')``.
Antworten