如何获取python导入树

Joe*_*ley 5 python python-import

我试图找出我的代码库中使用了多少不同的部分。如何最好地遍历导入树并找出导入什么?理想情况下,结果数据可以告诉我

  • 导入了哪些对象
  • 定义导入对象的文件
  • 对象导入到的文件

注意:一种选择是使用此帖子运行所有测试和配置文件。然而,测试甚至不是跨代码库,有些区域没有测试,所以这不会有很大的代表性。

Tim*_*Tim 2

由于所有对象都继承自,object您可以通过以下方式获取所有导入对象的列表:

>>> object.__subclasses__()
[<class 'type'>, <class 'weakref'>, ...]
Run Code Online (Sandbox Code Playgroud)

要查找模块,首先使用属性定义一个对象__module__

>>> type.__module__
'builtins'
Run Code Online (Sandbox Code Playgroud)

所有导入的模块中的一个都dict可以从该sys模块获得。使用模块名称作为键,可以检索模块对象,然后可以从属性中获取文件名__file__(对于大多数模块)。

>>> import sys
>>> import csv
>>> csv_module = sys.modules['csv']
>>> csv_module.__file__
'...lib/python3.6/csv.py'
Run Code Online (Sandbox Code Playgroud)

注意:并非所有模块都包含该__file__属性,尤其是内置模块,请务必用作hasattr(module, "__file__")防护。

我将把如何将它们组合在一起以让你的树变得更好。