Python + PDM のプロジェクトを IntelliJ IDEA と VS Code で開発する
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
を指定する。
{
"python.autoComplete.extraPaths": ["__pypackages__/3.11/lib"],
"python.analysis.extraPaths": ["__pypackages__/3.11/lib"]
}
終わりに
また別のコツやハマりどころが見つかれば書き足す予定。
Discussion