Return a list of imported Python modules used in a script?

后端 未结 13 2254
深忆病人
深忆病人 2020-11-30 00:23

I am writing a program that categorizes a list of Python files by which modules they import. As such I need to scan the collection of .py files ad return a list of which mod

13条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-30 01:02

    I recently needed all the dependencies for a given python script and I took a different approach than the other answers. I only cared about top level module module names (eg, I wanted foo from import foo.bar).

    This is the code using the ast module:

    import ast
    
    
    modules = set()
    
    def visit_Import(node):
        for name in node.names:
            modules.add(name.name.split(".")[0])
    
    def visit_ImportFrom(node):
        # if node.module is missing it's a "from . import ..." statement
        # if level > 0 it's a "from .submodule import ..." statement
        if node.module is not None and node.level == 0:
            modules.add(node.module.split(".")[0])
    
    node_iter = ast.NodeVisitor()
    node_iter.visit_Import = visit_Import
    node_iter.visit_ImportFrom = visit_ImportFrom
    

    Testing with a python file foo.py that contains:

    # foo.py
    import sys, os
    import foo1
    from foo2 import bar
    from foo3 import bar as che
    import foo4 as boo
    import foo5.zoo
    from foo6 import *
    from . import foo7, foo8
    from .foo12 import foo13
    from foo9 import foo10, foo11
    
    def do():
        import bar1
        from bar2 import foo
        from bar3 import che as baz
    

    I could get all the modules in foo.py by doing something like this:

    with open("foo.py") as f:
        node_iter.visit(ast.parse(f.read()))
    print(modules)
    

    which would give me this output:

    set(['bar1', 'bar3', 'bar2', 'sys', 'foo9', 'foo4', 'foo5', 'foo6', 'os', 'foo1', 'foo2', 'foo3'])
    

提交回复
热议问题