我對python相當陌生,現在一直在玩它。我一直玩的內置compile()
函數,以及marshal
和內置exec()
。我注意到了一些我不能找到答案的東西。請看下面的代碼:Python exec()的編組代碼對象
with open('simple.py', 'r') as f:
code = f.read()
exec code
然而,當編譯成通過compile()
代碼對象,通過marshal.dump()
系列化,保存到一個文件,然後閱讀:
#!/usr/bin/python
def foo():
print "Inside foo()..."
def main():
print "This is a simple script that should count to 10."
for i in range(0, 10):
print "This is iteration number", i
foo()
if __name__ == "__main__":
main()
當通過類似運行也能正常工作從文件中,通過marshal.load()
進行反序列化,並使用exec()
運行,結果爲NameError
,指出全局名稱foo
未定義。
我看過dir()
給出的輸出,當我的代碼爲import()
時,我可以看到它的定義爲foo()
。我還注意到,在反序列化的代碼對象上使用dis.dis()
(通過marshal.load()
讀取),我看到的唯一情況是LOAD_NAME
和CALL_FUNCTION
對於main()
(而不是像exec 'import %s' % modname
那樣做,然後做dis.dis(sys.modules[modname])
,這會給你如預期的那樣進行整個拆卸)。
我正確的是有某種查詢表,import()
諮詢得到這些地址? (爲了記錄,我檢查了http://svn.python.org/projects/python/trunk/Lib/py_compile.py以及我在通過py_compile.compile()
生成的字節碼和內置的compile()
是imp.get_magic()
以及32位時間戳中可以看到的唯一差別。如果存在這樣的表格,有沒有一種很好的方法來諮詢它?
謝謝!
什麼是通過'marshal.dump()'序列化?文本文件? – Claudiu
該腳本的代碼對象通過'compile()'生成。 – user1633448
你是什麼意思?以下內容似乎有效: with open('simple.py','r')as f: code = f.read() with open('simple.mash','w')as f: marshal.dump(代碼F) 開放( 'simple.mash', 'R')爲f: 碼= marshal.load(F) EXEC代碼 – Dhara