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

cap*_*tle 2 python python-3.x

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

例如,在:

import foo

def func():
    from bar import *
    return 42
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

您可以使用该ast模块分析代码.

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)
Run Code Online (Sandbox Code Playgroud)

产生

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