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

时间:2017-10-19 18:09:44

标签: python python-2.7 python-3.x python-import python-module

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

我决定在我的模块中添加一个__dependencies__ dict,用于描述模块导入的所有模块的版本。

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

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倾向于在重构时清理我的手动导入,这使得它很难保持工作。

1 个答案:

答案 0 :(得分:3)

您可以使用inspect moudule

例如:

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