如何获取Python模块所导入的模块列表

9 浏览
0 Comments

如何获取Python模块所导入的模块列表

我想在Python中访问某种导入依赖项跟踪(如果有的话)。我决定向我的模块添加一个__dependencies__字典,描述由模块导入的所有模块的版本。我想有一种自动化的方式获取由我的模块导入的模块列表,最好是在模块的最后一行。使用ModuleFinder(如如何列出Python模块中的导入?所建议)是行不通的,因为必须对已经加载的模块进行检查。 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(由什么是列出所有已导入模块的最佳方法?建议)会返回太多信息。我可以比较模块代码的开头和结尾的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倾向于在重构时清理我的手动导入,这使得保持它工作起来很困难。

admin 更改状态以发布 2023年5月21日
0
0 Comments

您可以使用inspect模块。

例如:

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

这里有一个实时示例

如果您想要导入本地模块,请使用:

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

另一个实时示例

0