PyCodeObject。
pyc文件的讀入:
讀入pyc文件的部分可以參考python的importlib豁陆。在3.6版本中,讀入pyc文件的邏輯在importlib/_bbotstrap_external.py中蜓斧。pyc文件中除了存儲codeobject之外盲镶,還存儲了頭部信息侥袜。
對頭部信息的判斷在_validate_bytecode_header中:
magic = data[:4]
raw_timestamp = data[4:8]
raw_size = data[8:12]
前四字節(jié)為Magic Number,用來對pyc文件的版本進行校驗溉贿。_validate_bytecode_header在SourceLoader類的get_code中被調用系馆。get_code中先使用_validate_bytecode_header檢查頭部,之后使用_compile_bytecode處理顽照,而_compile_bytecode中則是調用了marshal.loads由蘑。marshal實現(xiàn)的是對象的序列化和反序列化操作,marshal.load是將一個序列化的對象讀取到內存中代兵。
參照這一過程尼酿,可以如下實現(xiàn)讀取pyc文件的功能:
def read_pyc(pyc_filename):
? ? fp = open(pyc_filename, "rb")
? ? magic = fp.read(4)
? ? raw_timestamp = fp.read(4)
? ? raw_size = fp.read(4)
? ? c = marshal.load(fp)
? ? return c
這一函數(shù)忽略了檢查過程,跳過文件頭部之后讀取codeobject植影。讀取到codeobject之后裳擎,可以用dir函數(shù)查看其屬性,之后讀取對應屬性并輸出思币。
其他部分鹿响,3中與2中差別不大。3中的codeobject的屬性與書中一致谷饿,dis模塊也依然在惶我。用于序列化和反序列化的marshal模塊實現(xiàn)因為不是一個關鍵因素,就未與書中進行對比了博投。