python のマルチプロセスプログラムを VSCode でデバッグする


python の multiprocessing モジュールを使ったプログラムを VSCode 上でデバッグする方法です

想定している読者

  • multiprocessing モジュールを使用した python のコードが、コンソールでは問題なく動くのに VSCode でデバッグをしようとすると動かねーっていう方
  • python のマルチプロセスプログラムを理解したいけどデバッガがないと判り味がねーっていう方
  • VSCodeでデバッグする時 ↓ こんなエラーがでて困ってる方
Exception escaped from start_client  

failed to launch debugger for child process  

AssertionError: can only join a child process  

RuntimeError: already started

やりかた

multiprocessing モジュールを使用したプログラムのデバッグには次の3点が必要です

・1. if __name__ == "__main__": を書くこと

デバッグを開始するファイル (トップレベル モジュール) には if __name__ == "__main__": が必須です。もしこのステートメントが記載されていないなら追加して、コードを整形しましょう。
場合によってはめんどくさい作業になるかもしれませんが、必須です。

・2. multiprocessing.set_start_method('spawn', True) というステートメントを書くこと

例えば、main ステートメントの直下に次のように書いとけばうまく行きます。

記載例
if __name__ == "__main__": 
    import multiprocessing 
    multiprocessing.set_start_method('spawn', True)

windows の方はさらに

freeze_support()

という行の追加が必要かもです

・3. launch.json に ' "subProcess": true ' というセクションを書くこと

Ctrl+Shift+D でデバッグモードにして構成の launch.json ファイルを編集します。

ここに、"subProcess": true というセクションを追記します。

構成の例
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "subProcess": true,    // 追記
      "console": "integratedTerminal"
    }
  ]
}

jupyter notebook ファイル (.ipynb) のデバッグ

VSCode は jupyter notebook のファイル (.ipynb) を開いて実行することができます。 しかしながら開いているコードをデバッグする機能はまだ無いです。もしマルチプロセスプログラムのデバッグをしたいなら VSCode の機能でpython スクリプトに変換したあと、上述の方法を適用してください。

確認した環境

OS: Debian 10
python: 3.7.4
Visual Studio Code: 1.44.0