nikkie-ftnextの日記

イベントレポートや読書メモを発信

pipx runするスクリプトを書く中でも、VS Codeによる補完のサポートを受ける

はじめに

ここすきここすきここすきここすき nikkieです。

pipx runにまつわるVS Codeの小ネタです。

目次

前回まで:pipx runはいいぞ!仮想環境レス🙌

このブログで最近取り上げていますが、pipxはPEP 723(Inline script metadata)の一部をサポートしています。

Pythonスクリプトにコメントとしてmetadataを書き、

# /// script
# dependencies = ["rich"]
# ///

pipx runで実行することで、スクリプトに必要なライブラリを仮想環境にインストールするという管理の手間をpipxにお任せできます!
仮想環境の管理から解き放たれるので、別の環境でもスクリプトを簡単に再現性高く動かせて、私にはとってもよいです。

さらに、pipxが管理する、スクリプト用の仮想環境にアクセスするには、PYTHONINSPECT=1 pipx runと実行すればよいことを見出しました。

VS Codeで補完を受けたい

すでに動くスクリプトを別の環境でも動かす場合、pipxはめちゃめちゃ力を発揮するのですが、仮想環境をpipxが管理するがゆえに開発中はやりづらさがあります。

依存するライブラリが不慣れな場合、VS Codeの補完が受けられないのがやややりづらいです   (※Copilotは元気よく提案してきます)

# /// script
# dependencies = [
#   "requests<3",
#   "rich",
# ]
# ///

import requests
from rich.pretty import pprint

importしたモジュールに黄色い線が引かれており、(requestsは該当しませんが)pprintは型がAnyとなっていて、いい感じの補完が受けられません。

PythonVS Codeの知識をつなぎ合わせて、この状態を解決していきます!

解決案:pipxが管理する仮想環境をSelect Interpreterする

macOSbrewでインストールしたpipxを使っています1

% pipx --version
1.5.0

PYTHONINSPECT環境変数を指定して上記スクリプトを実行し、対話モードに入ります。

% PYTHONINSPECT=1 pipx run ./script.py
>>>

sys.executableを確認します。
https://docs.python.org/ja/3/library/sys.html#sys.executable

Python インタプリタの実行ファイルの絶対パスを示す文字列です。

>>> import sys
>>> sys.executable
'/.../.local/pipx/.cache/2cdf4afd53bcfd9/bin/python'

これを控えたら対話モードは抜けます。
次はVS Codeの設定です。
https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment

  • コマンドパレット(⇧⌘P2にて、「Python: Select Interpreter
  • 「Enter interpreter path...」を選び、sys.executableの値を入力

VS Codeのドキュメントは英語ではありますが、画像付きで操作が分かりやすいです)

これでpipxが管理する仮想環境に入っているライブラリがVS Codeに認識され、補完が受けられます!
見てください、pprintに色がついてます3!関数の定義も見られますよ🙌

なお、sys.executablePythonについて-m pip listとすると、pipxが仮想環境で管理してくれているライブラリが一覧できます。

手順まとめ

  1. スクリプトにdependenciesをコメントで書く
  2. 1のスクリプトPYTHONINSPECT環境変数を指定の上、pipx runで実行
  3. 対話モードでsys.executableを確認
  4. 3で確認したPythonインタプリタのパスをVS Codeの「Select Interpreter」で指定

終わりに

pipx runに寄せていく中で直面した、スクリプトを書いている最中にVS Codeの補完を十分に受けられないという課題を解決しました。
Pythonの知識とVS Codeの知識を組み合わせていったら解決に至れました。
この解決案は簡単ではないので、簡単にする方法は考えてみたいですね。

全人類よ、Pythonスクリプトの実行にはpipxを使うのです!
コメントとして依存を書くだけで仮想環境の管理から解き放たれ、とっても楽ですよ〜

この記事の元ネタ


  1. brewで入れたpipxはbrewPythonに依存するようです。一方私はpyenvで管理しています。複数のPythonから指定したいときは、pipx run --python python3.11 ./script.pyのように指定しています
  2. VS Code最下部の右側をクリックしてもSelect Interpreterできます
  3. 色が濃いのはスクショの範囲外でpprintを呼び出しているからです