Python - 查看导入模块的虚线导入

ez1337

我想获取从任意模块导入的所有模块mm以下列方式导入模块时:

from a.b import c

或者:

import a.b.c as c

(其中ab是包,并且c是一个模块)

的结果dir(m)将包含c(除其他外)。

但是,当我使用:

import a.b.c

的结果dir(m)将包含a,而不是c

我也尝试sys._getframe(1).f_locals.items()在 import 之后迭代m,但得到了相同的结果。我怎么能,以这种方式m导入的对象c,知道它实际上是导入的c

阿兰菲

您可以使用ast模块来解析模块的源代码并提取导入:

import sys
import ast
import inspect


def find_imports(module):
    code = inspect.getsource(module)
    tree = ast.parse(code)

    imports = set()
    for node in ast.walk(tree):
        if isinstance(node, ast.Import):
            imports.update(alias.name for alias in node.names)
        elif isinstance(node, ast.ImportFrom):
            imports.add(node.module)
            for alias in node.names:
                module_name = '{}.{}'.format(node.module, alias.name)
                if module_name in sys.modules:
                    imports.add(module_name)

    return imports

请记住,这仅在模块的源可作为纯 python 代码使用时才有效。


例如,考虑这个模块:

from os.path import isfile
from importlib import util
import urllib.request as urlquest
import urllib.parse
import sys

此模块的输出将是

{'sys', 'urllib.request', 'os.path', 'importlib', 'importlib.util', 'urllib.parse'}

笔记:

  1. 此代码还捕获函数中的导入,而不仅仅是全局范围中的导入。
  2. 如果代码执行类似 的导入from module import submodule"module.submodule"将出现在输出中。但是,如果代码执行类似 的导入from module import non_module,则只会"module"出现在输出中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章