Danke Blackjack. Ganz checken tu ich das ehrlich gesagt noch nicht:
weil hier wird das ja auch so definiert:
Code: Alles auswählen
class class_above():
def __init__(self):
pass
def myfunc(self):
class Class1():
def __init__(self):
print "class1"
class Class2():
def __init__(self):
print "class2"
self.cl1 = Class1()
c1 = Class1()
c2 = Class2()
obj = class_above()
obj.myfunc()
und das funktioniert. Ist das das was du gemeint, hast zur "Laufzeit" und nicht wie hier "vordefiniert"?
Ich dachte mit exec wäre das so schön dynamisch. Aber eigentlich ist es von der Funktionaliät (bzw. Flexibilität, was wichtiger für mich ist), egal, ob jetzt ein file eingelesen wird und dann ausgeführt wird oder mit import. Ich müsste den ganzen Codeabschnitt posten. Ich poste den einmal, so lange ist der eh nicht. Auszug aus Drpython:
gekürzter Auszug aus drScriptMenu.py, das ganze ist in einer klasse definiert:
Code: Alles auswählen
def RunScript(self, scriptfname):
f = open(scriptfname, 'r')
scripttext = f.read()
f.close()
if scripttext.find("DrFilename") > -1:
scripttext = scripttext.replace("DrFilename", "self.parent.txtDocument.filename")
if scripttext.find("DrScript") > -1:
scripttext = scripttext.replace("DrScript.", "self.parent.DrScript.")
if scripttext.find("DrDocument") > -1:
scripttext = scripttext.replace("DrDocument", "self.parent.txtDocument")
if scripttext.find("DrPrompt") > -1:
scripttext = scripttext.replace("DrPrompt", "self.parent.txtPrompt")
if scripttext.find("DrFrame") > -1:
scripttext = scripttext.replace("DrFrame", "self.parent")
try:
code = compile(scripttext + '\n', "~/tmp.txt", 'exec')
except:
drScrolledMessageDialog.ShowMessage(self.parent, ("Error compiling script."),
"Error", wx.DefaultPosition, (550,300))
return
try:
exec(code)
except:
drScrolledMessageDialog.ShowMessage(self.parent, "Error running script:", "Error", wx.DefaultPosition, (550,300))
return
Hier werden einige Variablen ersetzt (um das ganze bedienerfreundlicher zu machen). Wenn man das ganze mit import ersetzt, müsste es gehen(?)
oder ich versuche das mit dem namespace, wie Du vorgeschlagen hast. Nachtrag: das passt in meinem Fall auch nicht recht, weil ich ja direkt in dem script, das aufgerufen wird, was machen möchte, und nicht ausserhalb (also in der klasse drscriptmenu, denn das sollte ja das ganz nur durchführen, egal was mit exec script dann definiert ist).
Jetzt ergibt sich noch eine Frage: Warum wird das bei mir vorher "kompiliert" und dieser Code mit exec ausgeführt (wahrscheinlich, um eventuelle Fehler im eingebetteten CodeFehler noch vorher anzuzeigen), bei dir aber gleich mit exec. Also kann exec vorcompilierten als auch direkten source code auswerten?