无法使用Python中的inspect通过exec获取“声明”的方法的源代码

时间:2012-08-22 11:38:30

标签: python reflection

以下代码抛出异常:

import inspect

def work():
    my_function_code = """def print_hello():
                              print('Hi!')
                       """
    exec(my_function_code, globals())
    inspect.getsource(print_hello)

上面的代码抛出异常IOError。如果我在不使用exec的情况下声明函数(如下所示),我可以很好地获取它的源代码。

import inspect

def work():
    def print_hello():
        print('Hi!')
    inspect.getsource(print_hello)

我有充分的理由做这样的事情。

有解决方法吗?可以这样做吗?如果没有,为什么?

2 个答案:

答案 0 :(得分:6)

在阅读@ jsbueno的回答后,我只看了inspect.py文件,这是我发现的:

def findsource(object):
    """Return the entire source file and starting line number for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a list of all the lines
    in the file and the line number indexes a line in that list.  An **IOError
    is raised if the source code cannot be retrieved.**"""
    try:
        file = open(getsourcefile(object))  
    except (TypeError, IOError):
        raise IOError, 'could not get source code'
    lines = file.readlines()               #reads the file
    file.close()

它清楚地表明它试图打开源文件然后读取其内容,这就是exec无法实现的原因。

答案 1 :(得分:3)

这甚至不可能。 python做什么来获取它正在运行的任何代码的源代码是在磁盘上加载源代码文件。它通过查看代码模块上的__file__属性来查找此文件。

用于通过“exec”或“编译”生成代码对象的字符串不会被这些调用产生的对象保留。

如果在生成的代码的全局字典中设置__file__变量,并在调用inspect.getsource之前将源字符串写入该文件,则可能会查看代码。< / p>