gpt4 book ai didi

python - 如何获取 python 模块导入的模块列表

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:09 25 4
gpt4 key购买 nike

我想在 Python 中访问某种导入依赖项跟踪,如果有的话。

我决定向我的模块添加一个 __dependencies__ 字典,描述该模块导入的所有模块的版本。

我想要一种自动获取我的模块导入的模块列表的方法。最好在模块的最后一行。

ModuleFinder (如 How to list imports within a Python module? 所建议)将不起作用,因为应对已加载的模块执行检查。

ModuleFinder 的另一个问题是它检查 Python 脚本(使用 if __name__ == '__main__' 分支),而不是模块.

如果我们考虑一个玩具脚本 script.py:

if __name__ == '__main__':
import foo

那么结果是:

>>> mf = ModuleFinder
>>> mf.run_script('script.py')
>>> 'foo' in mf.modules
True

如果脚本作为模块导入,则应为 False。

我不想列出所有导入的模块 - 只列出我的模块导入的模块 - 所以 sys.modules(由 What is the best way of listing all imported modules in python? 建议)会返回太多。

我可能会从模块代码的开头和结尾比较 sys.modules 的快照。但那样的话,我会错过我的模块使用的所有模块,但之前由任何其他模块导入。

列出模块从中导入对象的模块也很重要。

如果我们考虑一个玩具模块 example.py:

from foo import bar
import baz

那么结果应该是这样的:

>>> import example
>>> moduleImports(example)
{'foo': <module 'foo' from ... >,
'baz': <module 'baz' from ...>}

(它可能还包含递归导入的模块或 foo.bar 给定 bar 是一个模块)。

globls() 的使用(根据 How to list imported modules? )要求我手动处理非模块导入,例如:

from foo import bar
import bar

我怎样才能避免这种情况?

到目前为止,我的解决方案还有另一个问题。 PyCharm 倾向于清理我在重构时的手动导入,这使得它很难继续工作。

最佳答案

您可以使用 inspect模块

例如:

import inspect
import os
m = inspect.getmembers(os) # get module content
filter(lambda x: inspect.ismodule(x[1]), m) # filter dependant modules

这里有一个 live example

如果你想导入本地模块,只需使用:

filter(lambda x: inspect.ismodule(x[1]), locals().items()) # filter dependant modules

另一个live example

关于python - 如何获取 python 模块导入的模块列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com