Python exec () eines marshalierten Codeobjekts

8

Ich bin mit Python ziemlich neu und spiele jetzt schon ein bisschen mit ihm herum. Ich habe mit der eingebauten Funktion compile() zusammen mit marshal und dem eingebauten exec() herumgespielt. Ich habe ein paar Dinge bemerkt, auf die ich nicht wirklich Antworten finden kann. Betrachten Sie das folgende Skript:

%Vor%

Dies funktioniert gut, wenn es über etwas wie folgt ausgeführt wird:

%Vor%

Wenn es jedoch über compile() in ein Codeobjekt kompiliert, in marshal.dump() serialisiert, in einer Datei gespeichert und dann aus der Datei gelesen wird, über marshal.load() deserialisiert und mit exec() ausgeführt wird, wird es mit a NameError besagt, dass der globale Name foo nicht definiert ist.

Ich habe mir die Ausgabe von dir() angeschaut, und wenn ich import() den Code, kann ich sehen, dass es eine Definition für foo() hat. Ich habe auch bemerkt, dass ich mit dis.dis() auf dem deserialisierten Codeobjekts (gelesen via marshal.load() ) nur das LOAD_NAME und CALL_FUNCTION für main() sehe (im Gegensatz zu etwas wie exec 'import %s' % modname und dann dis.dis(sys.modules[modname]) , was Ihnen die gesamte Disassemblierung wie erwartet liefert.

Habe ich Recht, dass es eine Art Nachschlagetabelle gibt, die import() konsultiert, um diese Adressen zu bekommen? (Für das Protokoll habe ich Ссылка überprüft und die einzigen Unterschiede, die ich im Bytecode sehen konnte das wurde über py_compile.compile() generiert und das eingebaute compile() war das imp.get_magic() zusammen mit dem 32bit Zeitstempel. Wenn es eine solche Tabelle gibt, gibt es eine gute Möglichkeit, sie zu konsultieren?

Danke!

    
user1633448 29.08.2012, 14:45
quelle

1 Antwort

0

Dieses Skript übt Ihren simple.py-Code dreimal erfolgreich aus. Macht das etwas klar? Oder missverstehe ich deine Frage?

%Vor%     
DrSkippy 29.08.2012, 19:54
quelle

Tags und Links