Python包中的依赖项

3
我知道这个主题已经有各种讨论了,但我有一个具体的,稍微不同的问题(我发现大多数现有的问题都集中在其他包的外部(内部)依赖关系上,而我的兴趣主要是我的直接包)。
我找到了各种工具来帮助查找和可视化依赖关系:
- pycallgraph:http://pycallgraph.slowchop.com/en/master/ - snakefood:http://furius.ca/snakefood/ - modulegraph:http://pythonhosted.org/modulegraph/ 我使用的问题在于它们显示了所有模块的依赖关系,而我真正想要关注的是自己的内部依赖以及每个模块的“第一个”外部依赖关系。例如:我在许多地方使用pandas和scipy,所以我希望看到这些引用,但不是这些包对其他内容的内部结构和依赖关系。您可以想象,这些会导致大量其他依赖项的爆炸,这些依赖项不在我的控制范围之内,因此不是我直接关心的。
Pycallgraph确实有效,但它提供了巨大的结果,使我感到难以区分我所关心的总体依赖关系的微小部分。有人有任何指针吗?我需要自己构建更简单的东西还是我忽略了什么?
谢谢您的帮助!
编辑:
所以对我来说,pycallgraph并不是很方便,因为它实际上是通过执行代码来工作的。modulegraph的问题在于(正如评论中所说),它创建了一个巨大的dot文件(9000行)。然而,它没有给出同一包级别的模块依赖关系。因此,如果您有一个名为“main”的包和模块“a”、“b”、“c”,以及一个名为“main.file_import”的模块和“x”、“y”、“z”,它会在“main”和“main.file_import”之间建立一个依赖关系。这不是我要找的,因为我正在尝试确定实际结构是否应该重构(在模块和函数/类级别上)。当我找到或创建一个好的解决方案时,我会继续在这里添加内容。我曾认为这是一个常见的问题。

1
你尝试过获取输出的原始图形表示(可能是dot),并编写脚本来削减图形吗(例如使用pydot)? - shx2
不好意思,我忽略了! :) 这是个好主意,理想情况下我希望在生成时就能够修剪它,但最终结果才是最重要的。我现在会尝试对模块图输出进行修剪! - Carst
如果它有效,请务必将其作为答案发布,以供后人参考 :) - shx2
谢谢;说实话,看着工具输出的结果,一方面给出了太多的外部依赖项,但另一方面内部依赖项却没有足够的细节(请参见我所做的编辑)。我想这个星期我会创建一个东西,并在这里发布! - Carst
2个回答

1

谢谢,我今晚会尝试。 - Carst

1
关于pycallgraph,我最终得到了一些有用的东西,基本上和您的出发点相同。
  1. 修改pycallgraph以将中间dot文件保存在您可以看到的位置。
  2. 运行egrep -v以修剪掉您不关心的内容。例如,这是您剥离所有logging调用的地方。
  3. 运行gvpr,这是一个与graphviz一起提供的DOT操作实用程序,可选择您感兴趣的节点。
基本概念代码位于https://gist.github.com/jpeyret/33739f6cd99f6108ad5046bd47df5a16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接