如何判断某些源代码中导入了哪些模块?

时间:2013-12-07 19:42:34

标签: python python-3.x

有没有办法检查源代码(或编译的代码对象)并告诉Python 3.3中导入了哪些模块?

例如,在:

import foo

def func():
    from bar import *
    return 42

我希望能够告诉我们正在导入模块foo和bar。我希望避免使用正则表达式或模式匹配。

1 个答案:

答案 0 :(得分:6)

您可以使用ast module分析代码。

import ast

class ImportNodeVisitor(ast.NodeVisitor):
    def visit_Import(self, node):
        print(ast.dump(node))
        self.generic_visit(node)

    def visit_ImportFrom(self, node):
        print(ast.dump(node))
        self.generic_visit(node)


with open(sourcefilename) as sf:
    tree = ast.parse(sf.read(), sourcefilename)
    ImportNodeVisitor().visit(tree)

产生

Import(names=[alias(name='foo', asname=None)])
ImportFrom(module='bar', names=[alias(name='*', asname=None)], level=0)