Python - 查看导入模块的点式导入
Python - View an imported module's dotted import
我想获取从任意模块导入的所有模块m
。
当m
以下列方式导入模块时:
from a.b import c
或:
import a.b.c as c
(其中 a
和 b
是包,c
是模块)
dir(m)
的结果将包含 c
(以及其他内容)。
然而,当我使用:
import a.b.c
dir(m)
的结果将包含 a
,而不是 c
。
我也尝试在导入 m
后迭代 sys._getframe(1).f_locals.items()
,但得到了相同的结果。
我如何以这种方式导入 c
的 m
对象,知道它实际上导入了 c
?
您可以使用 ast
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'}
备注:
- 此代码还捕获函数中的导入,而不仅仅是全局范围内的导入。
- 如果代码执行像
from module import submodule
这样的导入,"module.submodule"
将出现在输出中。但是,如果代码执行像 from module import non_module
这样的导入,输出中只会出现 "module"
。
我想获取从任意模块导入的所有模块m
。
当m
以下列方式导入模块时:
from a.b import c
或:
import a.b.c as c
(其中 a
和 b
是包,c
是模块)
dir(m)
的结果将包含 c
(以及其他内容)。
然而,当我使用:
import a.b.c
dir(m)
的结果将包含 a
,而不是 c
。
我也尝试在导入 m
后迭代 sys._getframe(1).f_locals.items()
,但得到了相同的结果。
我如何以这种方式导入 c
的 m
对象,知道它实际上导入了 c
?
您可以使用 ast
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'}
备注:
- 此代码还捕获函数中的导入,而不仅仅是全局范围内的导入。
- 如果代码执行像
from module import submodule
这样的导入,"module.submodule"
将出现在输出中。但是,如果代码执行像from module import non_module
这样的导入,输出中只会出现"module"
。