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