【问题标题】:access python module code访问python模块代码
【发布时间】:2014-08-29 13:25:58
【问题描述】:

我正在尝试访问导入模块时执行的代码。

可视化源代码或编辑它不是这里的问题。我想知道这些指令存储在哪里。

示例

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' 指令的任何内容?

【问题讨论】:

  • @pokoli,这不相关 - 这不是 quine,它正在尝试访问字节码。
  • print 'module' 不存在于任何对象中。它在定义模块时执行,但不是模块的部分。包含定义模块的代码的文件与执行该文件产生的module 对象之间存在区别。
  • @chepner:哦,好的,谢谢!所以如果我想更深入,我应该打开一个不同的问题:如何挂钩 import builtin 以跟踪导入时执行的代码? (我是新来的)
  • 这听起来是一个很好的问题(快速搜索__import__ 并没有找到任何相关内容)。

标签: python python-2.7 introspection


【解决方案1】:

From the documentation:

dis.dis([字节源])

反汇编字节源对象。 bytesource 可以表示模块、类、方法、函数或代码对象。对于一个模块,它会反汇编所有功能。

由于 module.py 是一个模块,它正在反汇编模块中的所有功能。由于“print 'module'”调用不在函数中,因此不会被反汇编。

编辑:

要回答实际问题(对此感到抱歉),因为当您导入模块本身时会调用该语句,我很确定您可以按如下方式解决它(尽管这有点可怕,随着解决方案的发展,并且可能有更好的方法):

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

这是对 dis 工作原理的轻微滥用,但是,嘿,它似乎有效。

【讨论】:

  • 这回答了问题“为什么dis.dis 不显示print 指令”,但 “哪里可以我发现……”.
  • 好的,所以也许 dis.dis 不是适合这项工作的工具,但是否还有其他工具可以让我访问这个特定的“打印'模块'”指令?编辑:正如 jonrsharpe 在我之前 20 岁所说的那样
  • @jonrsharpe 好点了吗?
  • 嗯,不清楚为什么要将函数包装在一个类中,它实际上从未向您显示PRINT_ITEM 的指令。
  • @edit :我试过了,但它似乎不起作用。它只返回一个非常小的字节码,其中包含 IMPORT_NAME 0(模块)。但也许我做错了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多