🤖

Python + PDM のプロジェクトを IntelliJ IDEA と VS Code で開発する

2023/02/20に公開約2,900字

PDM を使って PEP 582 に沿ってパッケージ管理を行っている Python プロジェクトで IntelliJ IDEA と VS Code を使って開発する機会があったので、設定方法について書く。

環境

  • macOS: Ventura 13.0.1
  • Python: 3.11.2
  • PDM: 2.4.5
  • IntelliJ IDEA: IntelliJ IDEA 2022.3.2 (Ultimate Edition)
    • Build #IU-223.8617.56, built on January 26, 2023
  • VS Code: Version: 1.74.2

Python と PDM のインストール

まずは Python をインストールする。 macOS に組み込みのものを使う、 Homebrew でインストールする、 pyenv を使用するなど様々な手段があるが、今回は asdf を使ってインストールする。

$ asdf install python 3.11.2

PDM は Homebrew でインストールする。

$ brew install pdm

PDM の初期設定

PDM の初期設定を行う。

$ pdm init

対話の途中で virtualenv を使用するかどうか尋ねられるが、今回は使用しないので n を入力する。

Would you like to create a virtualenv with /Users/hamakou108/.asdf/installs/python/3.11.2/bin/python? [y/n] (y): n

インタープリタの設定

IntelliJ IDEA の場合

IntelliJ IDEA の Python SDK の設定を行う。

JetBrains の File から Project Structure を開き、表示されたウィンドウの Project メニューから Python SDK を追加するウィンドウをさらに開く。

System Interpreter メニューの Interpreter のパスに、 asdf which python で取得できるパス (${HOME}/.asdf/installs/python/3.11.2/bin/python3.11) を設定する。1つ前のウィンドウの SDKs を開き、追加した SDK を選択して Classpath が生成されていることを確認する。

asdf の shims のパス指定について

Interpreter のパスに which python で取得できるパス (${HOME}/.asdf/shims/python) を設定しようとすると Cannot Detect SDK Versions エラーが発生する。

asdf はコマンドが実行されたディレクトリに適したバージョンのランタイムを自動的に選択するようになっており、 .asdf/shims を経由して .asdf/installs 以下に格納されている適切なバージョンのランタイムを呼び出すような動作になっている。ここもシンボリックリンクになっているので、恐らく IntelliJ IDEA はリンクをランタイム本体まで追跡しきれてないのではと推測している。

Classpath について

Classpath が未生成の状態だと標準ライブラリ等の補完が効かない。筆者の環境では、新たに SDK を作り直すと生成され、既存の SDK のパスを変更しても生成されないような動作が確認された。

VS Code の場合

コマンドパレットを開いて Python: Select Interpreter を選択する。

さらに + Enter interpreter path... を選択し、 IntelliJ IDEA と同様に Python のパスを設定する。

外部パッケージの補完

ここまでの状態だと PDM でインストールしたパッケージの補完が効かないので、 __pypackages__ 以下にパッケージが配置されていることを IDE に認識させる。

IntelliJ IDEA の場合

前述した SDK の Classpath に <your_root_path>/__pypackages__/3.11/lib を追加することで依存関係を解決できるようになる。

VS Code の場合

.vscode/settings.json で関係する設定値に __pypackages__/3.11/lib を指定する。

settings.json
{
  "python.autoComplete.extraPaths": ["__pypackages__/3.11/lib"],
  "python.analysis.extraPaths": ["__pypackages__/3.11/lib"]
}

終わりに

また別のコツやハマりどころが見つかれば書き足す予定。

Discussion

ログインするとコメントできます