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