【问题标题】:How to get the python import tree [closed]如何获取python导入树[关闭]
【发布时间】:2019-08-11 10:16:16
【问题描述】:

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

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

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

【问题讨论】:

  • Pyflakes、pylint 或类似工具是检查未使用的导入(以及其他东西)的有用工具
  • 您也可以只使用覆盖率 (coverage.readthedocs.io/en/v4.5.x) 运行代码,但这自然也不会 100% 准确。
  • 哦,如果有帮助,您还可以使用gc.get_objects() 获取解释器的垃圾收集器已知的每个对象的列表。

标签: python python-import


【解决方案1】:

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

>>> object.__subclasses__()
[<class 'type'>, <class 'weakref'>, ...]

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

>>> type.__module__
'builtins'

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

>>> import sys
>>> import csv
>>> csv_module = sys.modules['csv']
>>> csv_module.__file__
'...lib/python3.6/csv.py'

注意:并非所有模块都包含__file__ 属性,尤其是builtins 模块,请务必使用hasattr(module, "__file__") 作为保护。

我会留下如何将它们放在一起,让你的树由你决定。

【讨论】:

  • @joel,如果你知道怎么做,你能分享一下吗?蒂姆,这将有助于扩展您的解决方案以提供完整的方法。提前致谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多