PyBP — 変数も図も残る Python 実行環境
F5 で Python スクリプトを 常駐 IPython セッションの中で実行します。エディタの赤丸(ブレークポイント)で
停止でき、実行が終わっても変数と figure は生きたまま残ります。実行後にそのまま変数を確認したり、
続きの計算をしたりできます。MATLAB のコマンドウィンドウに近い使い心地です。
debugpy は使いません(中身は IPython + ipdb)。赤丸を1つも置かなければトレースは入らないので、
通常の python script.py と同じ速度で走ります。
インストール
.vsix を受け取ったフォルダで:
code --install-extension pybp-0.2.0.vsix
VS Code を完全に終了して、開き直してください。 ウィンドウの再読み込みだけでは足りません。
入ったか確認するには:
code --list-extensions
bisan.pybp が出れば OK です。
必要なもの
Python 3.9 以上(3.9 〜 3.13 で動作します)。
使う Python に以下が入っている必要があります。
| パッケージ |
用途 |
ipython |
セッション本体 |
ipdb |
赤丸での停止・ステップ実行 |
matplotlib |
図の表示 |
tornado |
既定の webagg バックエンド(図を VS Code のタブに出すのに必須) |
不足していても大丈夫です。 初回の F5 で拡張が自動的に検出し、
「PyBP: 依存パッケージが不足しています(…)」という通知で [インストール] を選べば
python -m pip install … を実行します。[あとで]を選んでもセッション自体は起動します。
自分で入れるなら:
python -m pip install ipython ipdb matplotlib tornado
Python 3.9 の場合、pip が自動的にその版に対応するバージョン
(ipython 8.18 系 / matplotlib 3.9 系)を選びます。バージョン指定は不要です。
pybp パッケージ本体はこの拡張に同梱されています。pip install pybp は不要です。
はじめての実行
- フォルダを開きます(ファイル → フォルダーを開く)。
これは重要です。PyBP は開いたフォルダの
.vscode/ を通して拡張と Python がやり取りするため、
ファイル単体で開いた状態では赤丸が効きません。 スクリプトも、開いたフォルダの中に置いてください。
.py ファイルを開きます。
- 行番号の左をクリックして赤丸を置きます(VS Code の標準機能です)。
- F5。ターミナル「PyBP」が開き、
[pybp] session started (webagg backend) と表示されます。
- 赤丸の行で実行が止まり、その行がハイライトされます。ステータスバーに
PyBP: ファイル名:行番号 が黄色く出ます。
- F5 で続行、F10 で次の行へ。最後まで走ると IPython プロンプト
In [n]: に戻ります。
- ここで変数がそのまま残っています。 プロンプトで変数名を打てば中身を確認できます。
使い方
キー操作
| キー |
状態 |
動作 |
| F5 |
通常 |
初回: セッション起動 + 実行 / 2回目以降: 同じセッションで再実行 |
| F5 |
停止中 |
続行 (c) |
| F10 |
停止中 |
ステップオーバー (n) |
| F11 |
停止中 |
ステップイン (s) |
| Shift+F11 |
停止中 |
ステップアウト (r) |
| Shift+F5 |
停止中 |
デバッガを抜ける (q) → IPython プロンプトへ |
| Ctrl+Shift+F5 |
通常 |
セッションを破棄して最初から起動し直す |
| Ctrl+C |
Figure タブ |
その figure の画像をクリップボードへコピー |
エディタ右上のツールバーにも同じボタンが並びます(▷ 実行 / 続行 / ステップ / 停止 / 再起動 / 📈 Figure を開く)。
すべて Ctrl+Shift+P のコマンドパレットから PyBP: で呼ぶこともできます。
F5 を押すとファイルは自動保存されてから実行されます。
2回目以降が速い理由
1回目の F5 で IPython セッションが立ち上がり、そのセッションは実行後も生き続けます。
2回目以降の F5 は同じセッションに再実行を投げるだけなので、起動のオーバーヘッドがありません。
スクリプトはセッションの名前空間の中で実行されるため、定義された変数はそのまま残ります。
%reset でワークスペースをクリア
exit でセッション終了
- 自作モジュールは
autoreload が有効なので、編集すると次の実行に自動で反映されます
(挙動が怪しくなったら Ctrl+Shift+F5 でセッションごと作り直してください)
- IPython プロンプトから
%pybp "C:\path\to\script.py" と手で打っても同じ実行ができます
赤丸について
- 条件付きブレークポイントに対応しています。 赤丸を右クリック →「条件付きブレークポイントの編集」
- 赤丸を無効化(グレー)すると、その行では止まりません
- 停止中に赤丸を足したり消したりできます。 次の続行・ステップ操作から反映されます
- 赤丸が1つも無ければトレースは一切入らず、素の速度で走ります
エラーが出たとき
例外が発生すると、そのエラーが起きた行で自動的に停止します(ポストモーテムデバッグ)。
エディタ上でエラー行がハイライトされ、ipdb> プロンプトでその時点の変数をそのまま調べられます。
ライブラリの内部ではなく、自分のコードの一番深い場所が選ばれます。
調べ終わったら q(または Shift+F5)で抜けてください。
matplotlib の figure は webagg バックエンドでノンブロッキング表示され、figure ごとに VS Code のタブが開きます。
plt.show() で実行が止まることはありません。実行が終わってもタブは残ります。
- コピー: タブ右上の 📋、グラフのツールバーの Copy、または Ctrl+C で、その figure の画像を
クリップボードへ入れます。Word / PowerPoint にそのまま貼り付けられます
(Windows のみ。VS Code のクリップボード API がテキスト専用のため、PowerShell 経由で実装しています)
- 保存: ツールバーの 💾 は VS Code の保存ダイアログを開きます。形式は隣のドロップダウン
(png / svg / pdf など)に従います
plt.close(n) で閉じた figure のタブは自動的に閉じます。plt.close("all") で全部閉じます
- タブを自分で閉じても figure 自体は生きているので、PyBP: Open Figures(📈 ボタン)で開き直せます
- 自動で開いてほしくない場合は設定
pybp.figureDisplay を manual に。
figure は作られたままなので、PyBP: Open Figures(📈)で必要なときだけ開けます
- タブではなく OS の別ウィンドウに出したい場合は
pybp.figureDisplay を window に。
matplotlib の Qt / Tk バックエンドに切り替わり、webagg サーバーは起動しません
(どちらを使うかは pybp.windowBackend。auto なら PyQt / PySide → tkinter の順に探します)。
この場合 Figure タブが無いので、📋 コピーと VS Code の保存ダイアログは使えません。
matplotlib のウィンドウに付いている標準のツールバーを使ってください
- 図を一切出したくない場合は
pybp.figureDisplay を none に。webagg サーバーを
起動しないのでポート(既定 8988)も使いません。Agg バックエンドになるため
plt.show() は何もせず、fig.savefig("out.png") でのファイル出力はそのまま使えます
設定
Ctrl+, の設定画面で pybp を検索してください。
| 設定 |
既定 |
内容 |
pybp.pythonPath |
python |
セッション起動に使う Python 実行ファイル。フルパス可 |
pybp.webaggPort |
8988 |
図の表示に使うポート。他のアプリと衝突する場合に変更 |
pybp.useBundledPython |
true |
同梱の pybp を使う。通常は true のままにしてください |
pybp.figureDisplay |
tab |
図の表示先。tab(タブを自動で開く)/ manual(タブだが自動で開かない)/ window(別ウィンドウ)/ none(表示しない) |
pybp.windowBackend |
auto |
figureDisplay が window のときのバックエンド。auto / qt / tk |
pybp.autoOpenFigures |
true |
非推奨。pybp.figureDisplay に統合されました(false は manual と同じ) |
pybp.figureDisplay を変えたら Ctrl+Shift+F5 でセッションを作り直してください
(バックエンドは起動時に決まります)。確認のダイアログも出ます。
ターミナルから python -m pybp を直接起動する場合は、環境変数 PYBP_MPL で
バックエンドを指定できます(既定 webagg。qt / tk / inline / none / auto)。
うまく動かないとき
| 症状 |
原因と対処 |
| 赤丸を置いても止まらない |
フォルダを開かずファイル単体で開いています。フォルダーを開くで開き直し、スクリプトをそのフォルダ内に置いてください |
PyBP: Python を実行できません |
pybp.pythonPath が正しい Python を指していません。フルパスで指定してみてください |
| 依存パッケージの確認が毎回出る |
pybp.pythonPath が、依存を入れた Python と別のものを指しています。ターミナルで python -c "import sys; print(sys.executable)" を実行し、その結果を pybp.pythonPath に設定してください |
| F5 が反応しない / コマンドが無い |
VS Code を完全終了して開き直してください。それでも駄目なら code --uninstall-extension local.pybp の後に再インストール |
pybp を import できません と出る |
拡張に同梱された pybp に PYTHONPATH が通っていません。設定 pybp.useBundledPython が true になっているか確認し、拡張を入れ直して VS Code を完全終了・再起動してください |
No module named 'IPython' などで落ちる |
pybp.pythonPath の Python に依存が入っていません。F5 で出る[インストール]を選ぶか、python -m pip install ipython ipdb matplotlib tornado を実行してください |
| 図が出ない / タブが空白 |
pybp.webaggPort(既定 8988)が他のアプリと衝突しています。別の番号に変えてセッションを再起動(Ctrl+Shift+F5)してください。タブが空白のままならパネルの境界をドラッグしてサイズを変えると描画されます |
| 図のコピーができない |
Windows のみ対応です。macOS / Linux では 💾 での保存を使ってください |
| セッションがおかしくなった |
Ctrl+Shift+F5 でセッションを作り直してください。それでも駄目ならターミナル「PyBP」を閉じてから F5 |
原因が分からないときは、ワークスペースの .vscode/py_ext_log.txt に拡張側の動作ログが残っています
(セッション起動のたびに書き直されます)。これを添えて報告してもらえると調査できます。
.vscode/ に出てくるファイル
PyBP は拡張と Python の間のやり取りに、開いているフォルダの .vscode/ 直下を使います。
自動で作られ、セッション終了時に消えます。手で編集する必要はありません。
| ファイル |
中身 |
py_breakpoints.json |
拡張 → Python : 赤丸の一覧 |
py_debug_state.json |
Python → 拡張 : 現在の停止位置 |
py_session.json |
Python → 拡張 : セッションが生きているかの通知 |
py_figures.json |
Python → 拡張 : 表示中の figure 番号 |
py_save_request.json |
Python → 拡張 : 図の保存ダイアログ要求 |
py_ext_log.txt |
拡張の動作ログ(調査用) |
git で管理しているフォルダなら、.gitignore に .vscode/py_* を足しておくと邪魔になりません。
制約
- 赤丸がある実行では pdb のトレースが入るため、重い数値計算は遅くなります(赤丸ゼロなら素の速度)
- 停止中のマウスホバーによる変数表示には未対応です。
ipdb> プロンプトで変数名を打ってください
- 標準ライブラリ・IPython・matplotlib の内部には F11(ステップイン)でも入りません
- 図のクリップボードコピーは Windows のみです