2014-08-29 101 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