pydepsでPythonプロジェクトの依存関係を可視化してみる

こんにちは
筆者と酒は循環参照
システムソリューション部のかわいです。
5月ですね。なんどめだゴールデンウィーク
さて、Pythonで何かしら開発を進めていると「このコードはどのモジュールに依存してるんだっけ?」「プロジェクト全体の構造が把握できない」なんて悩みにぶつかることありませんか?(え、ない?)
そんな悩みを手助けしてくれる便利なツールがpydepsです。
pydepsを使うと、Pythonプロジェクトのモジュール間の依存関係を解析し、図で分かりやすく可視化してくれます。
この記事ではpydepsのインストールや使い方について紹介します。
セットアップと下準備
■検証環境
Ubuntu 24.04.2 LTS Python 3.12.3
図の描写用にGraphvizをインストールします。
$ sudo apt update $ sudo apt install graphviz
任意の場所にプロジェクト用のディレクトリを作成し移動します。
今回はPython標準のvenvを使います。バージョン管理ツールはなんでもいいのでお好みで。
$ mkdir myproject $ cd myproject $ python3 -m venv env $ source env/bin/activate
pydepsをインストール
(env)$ pip3 install pydeps
サンプルコードの作成
myproject/以下に簡単なコードを置きます。
main.pyがutils.pyをインポートして利用する、基本的な依存関係を示すサンプルコードです
■構成
myproject/ ├── main.py └── utils.py
■utils.py
def helper_function():
print("これはヘルパーファンクションです")
■main.py
import utils # utils.pyをインポート
def main_process():
print("メインプロセスを実行します")
utils.helper_function()
if __name__ == "__main__":
main_process()
main.pyを細かく分解すると、
1) utils.pyという別のファイルに依存しており(import utils)、
2) その中のhelper_functionを利用して(utils.helper_function())、
3) main_processという関数内で主要な処理を行い、
4) スクリプトとして直接実行された場合に、そのmain_processを開始する(if __name__ == "__main__":)
という構造になっています。
# 実行結果 (env)$ python3 main.py メインプロセスを実行します これはヘルパーファンクションです
pydepsを試してみる
早速main.pyに対して実行してみます。
(env)$ pydeps main.py
▼「main.svg」が出力されました。

pydepsは、"import utils"という行を見て、「mainはutilsに依存している」という情報を図として表示します。
ちなみに全然別プロジェクトの内容ですが、依存関係が複数ある場合はこういった出力になります。

その他オプション
また、オプションを使うとsvg形式以外に出力することができます。
■他拡張子に出力
# -oオプション (env)$ pydeps main.py -o dependency.png
■jsonベースで出力
(env)$ pydeps main.py --show-deps
{
"main.py": {
"bacon": 0,
"imports": [
"utils"
],
"name": "main.py",
"path": null
},
"utils": {
"bacon": 1,
"imported_by": [
"main.py"
],
"name": "utils",
"path": "/home/hamchan/TEST/myproject/utils.py"
}
}
上記のように、色んな形式で出力することも可能です。
導入もめちゃくちゃ簡単なので、ぜひ一度試してみてください
完
4