2014-08-29 107 views
1

我想要訪問模塊在導入時執行的代碼。訪問python模塊代碼

可視化源代碼或編輯它不是這裏的問題。我想知道這些指令的存儲位置。

module.py

def func(): 
    print 'func' 

print 'module' 

的Python控制檯

>>> import module 
module 
>>> import dis 
>>> dis.dis(module) 
Disassembly of func: 
0 LOAD_CONST    1 ('func') 
3 PRINT_ITEM   
4 PRINT_NEWLINE  
5 LOAD_CONST    0 (None) 
8 RETURN_VALUE   
>>> dir(module) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'func'] 

我在哪裏可以找到<function>對象,或func_code或任何其存儲print 'module'指令?

+1

@pokoli,沒有關係 - 這不是一個奎因,它試圖訪問字節碼。 – Phillammon 2014-08-29 13:33:49

+1

'print'module''不存在於任何對象中。它在模塊定義時執行,但不是模塊的*部分*。在包含定義模塊的代碼的文件和執行該文件產生的'module'對象之間存在區別。 – chepner 2014-08-29 13:37:39

+0

@chepner:哦,好的,謝謝!所以如果我想深入一點,我是否應該打開一個不同的問題:如何掛鉤導入內建以獲取在導入時執行的代碼的跟蹤? (我是新來的) – Centime 2014-08-29 13:42:36

回答

0

From the documentation:

dis.dis([bytesource])

拆卸bytesource對象。 bytesource可以表示模塊,類,方法,函數或代碼對象。對於一個模塊,它會分解所有功能。

由於module.py是一個模塊,它將分解模塊中的所有功能。由於「打印」模塊「」呼叫不在功能中,因此不會被拆卸。

編輯:

要回答這個問題,實際(約抱歉),作爲語句是當你導入模塊本身,我敢肯定,你可以按如下解決這個問題(雖然這是一個叫有點恐怖,因爲解決方案去,有可能是一個更好的方式來做到這一點):

class importer(): 
    def import_module(): 
     import module 
dis.dis(importer) 

這是DIS作品,但哎,看來如何工作的,輕微的虐待。

+1

這回答了問題*「爲什麼'dis.dis'不顯示'print'指令'*,但是**不是** *」哪裏可以找到...「*。 – jonrsharpe 2014-08-29 13:34:35

+0

好吧,也許dis.dis不是適合這項工作的工具,但是有沒有另一個可以讓我訪問這個特定的「打印」模塊的指令?編輯:正如jonrsharpe說的在我之前20s – Centime 2014-08-29 13:34:55

+0

@jonrsharpe還好嗎? – Phillammon 2014-08-29 13:48:18