Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-查看导入的模块';虚线进口_Python_Python Import_Python Module - Fatal编程技术网

Python-查看导入的模块';虚线进口

Python-查看导入的模块';虚线进口,python,python-import,python-module,Python,Python Import,Python Module,我想从任意模块m导入所有模块。 当m以以下方式导入模块时: from a.b import c 或: (其中a和b是包,c是模块) dir(m)的结果将包含c(以及其他内容) 但是,当我使用: import a.b.c dir(m)的结果将包含a,而不是c 导入m后,我还尝试迭代了sys.\u getframe(1).f\u locals.items(),但得到了相同的结果。 以这种方式导入c的m对象如何知道它实际导入了c?您可以使用解析模块的源代码并提取导入: import sys imp

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

from a.b import c
或:

(其中
a
b
是包,
c
是模块)

dir(m)
的结果将包含
c
(以及其他内容)

但是,当我使用:

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

导入
m
后,我还尝试迭代了
sys.\u getframe(1).f\u locals.items()
,但得到了相同的结果。 以这种方式导入
c
m
对象如何知道它实际导入了
c

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

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'}

笔记:
  • 此代码还捕获函数中的导入,而不仅仅是全局范围中的导入
  • 如果代码执行类似于从模块导入子模块导入的
    ,则输出中将出现
    “module.submodule”
    。但是,如果代码执行类似于从模块导入非模块的导入操作,则输出中将仅显示模块

  • 不太清楚您到底想要什么,如果c是一个模块,那么c就是模块本身,不管怎样,这取决于您的项目结构和每个包的
    \uuu init\uuuuy.py
    的内容。对不起,让我澄清一下:我想从任意模块
    m
    获取所有导入的模块。现在如果
    m
    以这种方式导入
    c
    import a.b.c
    ),我不会通过迭代
    dir(m)
    来获取
    c
    。假设我不知道
    c
    a.b
    里面-我怎么能得到它?非常感谢,它解决了我的问题。但请注意,当从函数内部进行导入时,它会失败(这确实不是一个好的做法,但在我的项目代码中会执行几次…@ezer1337代码更新;函数中的导入现在应该可以工作了。
    {'sys', 'urllib.request', 'os.path', 'importlib', 'importlib.util', 'urllib.parse'}