24590


# Pythonでモジュールの依存関係図を描きたい

本家Stack Overflowで次のような記事を見つけたのですが、  
[Python dependencies inside a package - Stack
Overflow](https://stackoverflow.com/questions/20829697/python-dependencies-
inside-a-package/20839064#20839064)

3種類ツールがあって、snakefoodなら描ける図の粒度を変えたりできる、ということまではわかっています。  
pycallgraph, snakefood, modulegraphのインストールはできました。

しかし、ドキュメントを読んでも、どうやって使っていいのかがイマイチぴんときません。  
pycallgraphは次のようにやればいいのですが、

[code]

    import pycallgraph
    pycallgraph.start_trace()
     # process
    pycallgraph.make_dot_graph('test.png')
    
[/code]

僕がやりたいのは、自分のコードのプロファイリングではなく、Pythonのパッケージ(gensimやその他の)の全体像の把握です。どういう設計になっているのかを俯瞰したいのです。  
それはどのようにすれば実現できるでしょうか？


CC BY-SA 3.0
2016-05-05T12:28:49.473
24588
2016-05-05T14:36:16.930
2020-06-17T08:14:45.997
-1
14383
question
python
Pythonモジュールの階層構造図を書きたい


[Generating Python Module Dependency
Graphs](http://www.tarind.com/depgraph.html)
が参考になりそうです。この記事の実行例を参考にして、`gensim` モジュールを対象に実行してみました。

[code]

    $ echo 'import gensim' |
      python py2depgraph.py /dev/stdin |
      python depgraph2dot.py |
      dot -T png -o gensim_dep.png
    
[/code]

最後の `dot` コマンドは `graphviz` パッケージに含まれているコマンドです。

ただ、こちらの実行環境は以下の通りなのですが、

[code]

          OS: Linux 4.4.0
      Distro: Ubuntu 16.04
      Python: 2.7.11
    graphviz: 2.38
    
[/code]

`py2depgraph.py` の実行時にエラーが発生しますので、以下の変更を施しています。

[code]

    --- py2depgraph.py.org
    +++ py2depgraph.py
    @@ -39,7 +39,7 @@
    
         def import_module(self,partnam,fqname,parent):
             r = modulefinder.ModuleFinder.import_module(self,partnam,fqname,parent)
    -        if r is not None:
    +        if r is not None and self._last_caller is not None:
                 self._depgraph.setdefault(self._last_caller.__name__,{})[r.__name__] = 1
             return r
    
[/code]

出力される `gensim_dep.png` ですが、、サイズが巨大です。

[code]

    $ identify gensim_dep.png
      gensim_dep.png PNG 32767x2789 8-bit sRGB 27.14MB
    
[/code]

以下は一部分だけを抽出したものです。

[![gensim_dep_crop.png](https://i.stack.imgur.com/AFU7W.png)](https://i.stack.imgur.com/AFU7W.png)

これでは実用的とは言えませんので、例えば `py2depgraph.py` の出力をフィルタリングするなどの処理が必要かと思います。


CC BY-SA 3.0
2016-05-05T14:36:16.930
24590
2016-05-05T14:36:16.930
24588
answer