【Python】Code2flowによるソースコードのフローチャート化

【Python】Code2flowによるソースコードのフローチャート化 プログラミング

「ソースコードの解析が面倒だ・・・」
「ソースコードをグラフなどで可視化したい」

このような場合には、Code2flowがオススメです。
この記事では、ソースコードをフローチャート化できるCode2flowについて解説しています。

本記事の内容

  • Code2flowとは?
  • Code2flowのシステム要件
  • Code2flowのインストール
  • Code2flowの動作確認

それでは、上記に沿って解説していきます。

Code2flowとは?

Code2flowとは、ソースコードをDOT言語のフローチャート化するPythonライブラリです。
Code2flowが対象とする言語は、以下。

  • Python
  • JavaScript
  • Ruby
  • PHP

フローチャートでは、関数の関連性を表現します。
関数(クラス含む)を認識して、その呼び出し関係を線でつなぎます。

次の図は、Code2flowで作成できるフローチャートになります。

プログラムの流れをフローチャートで把握することができます。
そして、詳細はソースを追いかけるという流れになります。

また、Python以外は別途Parser (パーサー)が必要です。

言語Parser
JavaScriptAcorn
RubyParser
PHPPHP-Parser
Python

なお、Code2flowは以下のサイトのWebサービスとは別物です。

code2flow – interactive code to flowchart converter
https://code2flow.com/

上記サービスは、基本的には有償のサービスになります。
Code2flowは、無料で使えるオープンソースです。

機能的にも全然違いますけどね。
スペルが同じであり、非常にややこしいです。

以上、Code2flowについて説明しました。
次は、Code2flowのシステム要件を説明します。

Code2flowのシステム要件

現時点(2022年8月)でのCode2flowの最新バージョンは、2.5.0となります。
この最新バージョンは、2022年3月26日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

サポート対象となるPythonのバージョンは、Python 3.6以降となります。
ただし、Python 3.6は以下のPython公式開発サイクルではサポート期限が切れています。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月

そのため、ここではPython 3.7以降を推奨しておきます。
ここまでは、特になんてことはないシステム要件です。

注意すべきシステム要件は、Graphvizになります。
Graphvizがインストール済みかどうかは、次のコマンドで確認できます。

$ dot -V
dot - graphviz version 2.43.0 (0)

上記コマンドを実行して、バージョンが出てくればOKです。
そうでない場合は、Graphvizのインストールが必要となります。

Windows・Ubuntuの場合は、以下の記事でGraphvizのインストールを解説しています。

上記を参考にして、Graphvizのインストールまで済ませておきます。

以上、Code2flowのシステム要件を説明しました。
次は、Code2flowのインストールを説明します。

Code2flowのインストール

検証は、次のバージョンのPythonで行います。

$ python -V
Python 3.10.2

まずは、現状のインストール済みパッケージを確認しておきます。

$ pip list
Package    Version
---------- -------
pip        22.2.2
setuptools 65.0.2
wheel      0.36.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、Code2flowのインストールです。
Code2flowのインストールは、以下のコマンドとなります。

pip install code2flow

Code2flowのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。

$ pip list
Package    Version
---------- -------
code2flow  2.5.0
pip        22.2.2
setuptools 65.0.2
wheel      0.36.2

Code2flowが依存するパッケージは、ありません。
その意味では、Code2flow導入は容易と言えます。

ただし、Graphvizのインストールが前提とはなります。

以上、Code2flowのインストールを説明しました。
次は、Code2flowの動作確認を説明します。

Code2flowの動作確認

Code2flowの動作確認を行います。
コードからフロー図を作成してみましょう。

Code2flowには、次の2つの利用方法が用意されています。

  • コマンドラインツール
  • Python API(モジュール)

今回は、コマンドラインツールで動作を確認します。
まずは、次のようなPythonスクリプトを用意します。

test.py

def fnc_a():
    print('a')
    fnc_b()


def fnc_b():
    print('b')


if __name__ == '__main__':
    fnc_a()

スクリプトの内容は、非常に簡単なコードです。
このスクリプトのコードからフロー図を作成します。

code2flow スクリプトのパス

上記形式のコマンドを実行した結果は、以下。

$ code2flow test.py 
Code2Flow: Found 1 files from sources argument.
Code2Flow: Implicitly detected language as 'py'.
Code2Flow: Processing 1 source file(s).
Code2Flow:   test.py
Code2Flow: Found groups ['File: test'].
Code2Flow: Found nodes ['(global)', 'fnc_a', 'fnc_b'].
Code2Flow: Found calls ['fnc_a()', 'fnc_b()', 'print()'].
Code2Flow: Found variables [].
Code2Flow: Generating output file...
Code2Flow: Wrote output file 'out.gv' with 3 nodes and 2 edges.
Code2Flow: For better machine readability, you can also try outputting in a json format.
Code2Flow: Code2flow finished processing in 0.00 seconds.
Code2Flow: Running graphviz to make the image...
Code2Flow: Graphviz finished in 0.04 seconds.
Code2Flow: Completed your flowchart! To see it, open 'out.png'.

同じディレクトリ上に、次のファイルを確認できます。

out.png

フロー図が言わんとすることは、理解できます。
細かいことは、慣れていけばよいでしょう。

次は、もう一つ関数を増やしてみましょう。

test2.py

def fnc_a():
    print('a')
    fnc_b()
    fnc_c()


def fnc_b():
    print('b')
    fnc_c()


def fnc_c():
    print('c')


if __name__ == '__main__':
    fnc_a()

次は、出力するファイルを指定します。

$ code2flow test2.py -o out2.png 
〜省略〜
Code2Flow: Completed your flowchart! To see it, open 'out2.png'.

out2.png

ちゃんと意図した通りにフローが描かれています。
Code2flowの動作確認としては、十分でしょう。

なお、code2flowコマンドのヘルプは以下で確認できます。

$ code2flow -h
usage: code2flow [-h] [--output OUTPUT] [--language {py,js,rb,php}] [--target-function TARGET_FUNCTION] [--upstream-depth UPSTREAM_DEPTH]
                 [--downstream-depth DOWNSTREAM_DEPTH] [--exclude-functions EXCLUDE_FUNCTIONS] [--exclude-namespaces EXCLUDE_NAMESPACES]
                 [--include-only-functions INCLUDE_ONLY_FUNCTIONS] [--include-only-namespaces INCLUDE_ONLY_NAMESPACES] [--no-grouping] [--no-trimming] [--hide-legend]
                 [--skip-parse-errors] [--source-type {script,module}] [--ruby-version RUBY_VERSION] [--quiet] [--verbose] [--version]
                 sources [sources ...]

Generate flow charts from your source code. See the README at https://github.com/scottrogowski/code2flow.

positional arguments:
  sources               source code file/directory paths.

options:
  -h, --help            show this help message and exit
  --output OUTPUT, -o OUTPUT
                        output file path. Supported types are ('png', 'svg', 'dot', 'gv', 'json'). (default: out.png)
  --language {py,js,rb,php}
                        process this language and ignore all other files.If omitted, use the suffix of the first source file. (default: None)
  --target-function TARGET_FUNCTION
                        output a subset of the graph centered on this function. Valid formats include `func`, `class.func`, and `file::class.func`. Requires
                        --upstream-depth and/or --downstream-depth. (default: None)
  --upstream-depth UPSTREAM_DEPTH
                        include n nodes upstream of --target-function. (default: 0)
  --downstream-depth DOWNSTREAM_DEPTH
                        include n nodes downstream of --target-function. (default: 0)
  --exclude-functions EXCLUDE_FUNCTIONS
                        exclude functions from the output. Comma delimited. (default: None)
  --exclude-namespaces EXCLUDE_NAMESPACES
                        exclude namespaces (Classes, modules, etc) from the output. Comma delimited. (default: None)
  --include-only-functions INCLUDE_ONLY_FUNCTIONS
                        include only functions in the output. Comma delimited. (default: None)
  --include-only-namespaces INCLUDE_ONLY_NAMESPACES
                        include only namespaces (Classes, modules, etc) in the output. Comma delimited. (default: None)
  --no-grouping         instead of grouping functions into namespaces, let functions float. (default: False)
  --no-trimming         show all functions/namespaces whether or not they connect to anything. (default: False)
  --hide-legend         by default, Code2flow generates a small legend. This flag hides it. (default: False)
  --skip-parse-errors   skip files that the language parser fails on. (default: False)
  --source-type {script,module}
                        js only. Parse the source as scripts (commonJS) or modules (es6) (default: script)
  --ruby-version RUBY_VERSION
                        ruby only. Which ruby version to parse? This is passed directly into ruby-parse. Use numbers like 25, 27, or 31. (default: 27)
  --quiet, -q           suppress most logging (default: False)
  --verbose, -v         add more logging (default: False)
  --version             show program's version number and exit

以上、Code2flowの動作確認を説明しました。

タイトルとURLをコピーしました