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:
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!
Tags und Links python