Python查看导入模块的虚线imp

2024-04-25 20:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从任意模块m导入所有模块。 当m以以下方式导入模块时:

from a.b import c

或:

import a.b.c as c

(其中ab是包,c是模块)

dir(m)的结果将包含c(以及其他内容)。你知道吗

但是,当我使用:

import a.b.c

dir(m)的结果将包含a,而不是c。你知道吗

在导入m之后,我还尝试迭代sys._getframe(1).f_locals.items(),但得到了相同的结果。 以这种方式导入cm对象,如何知道它实际导入了c?你知道吗


Tags: 模块对象fromimport内容asdirsys
1条回答
网友
1楼 · 发布于 2024-04-25 20:18:46

您可以使用^{} module解析模块的源代码并提取导入:

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"。你知道吗

相关问题 更多 >