Python + PDM のプロジェクトを VS Code と IntelliJ IDEA で開発する
PDM を使ってパッケージ管理を行っている Python プロジェクトで VS Code と IntelliJ IDEA を使って開発する機会があったので、設定方法について書く。
環境
- macOS: Ventura 13.0.1
- Python: 3.11.2
- PDM: 2.4.5
- VS Code: Version: 1.74.2
- IntelliJ IDEA: IntelliJ IDEA 2022.3.2 (Ultimate Edition)
- Build #IU-223.8617.56, built on January 26, 2023
Python と PDM のインストール
まずは Python をインストールする。今回は asdf を使ってインストールする。
$ asdf install python 3.11.2
PDM は Homebrew でインストールする。
$ brew install pdm
PDM の初期設定
PDM の初期設定を行う。
$ pdm init
対話の途中で仮想環境を作成するかどうか尋ねられる。
Would you like to create a virtualenv with /Users/hamakou108/.asdf/installs/python/3.11.2/bin/python? [y/n] (y):
y
を選択するとカレントディレクトリに virtualenv を使った仮想環境が作成され、 n
を選択すると PEP 582 に沿って __pypackages__
ディレクトリが作成される [1]。 PEP 582 は Python 3.12 からサポートされるらしく、2023年3月現在はエコシステムも発展途上であるため、特にこだわりがなければ virtualenv 方式で設定するのをおすすめする。
初期設定が完了すると、次のようにして必要な依存関係をインストールできる。
$ pdm add requests
VS Code の設定
インタープリタの設定
コマンドパレットを開いて Python: Select Interpreter を選択し、 + Enter interpreter path... を選択して Python のパスを設定する。
初期設定時の環境構築方法に応じて次のようにパスを設定する。
- virtualenv 方式の場合:
.venv/bin/python
- PEP 582 方式の場合:
~/.asdf/installs/python/3.11.2/bin/python3.11
asdf の shims のパス指定について
~/.asdf/installs/python/3.11.2/bin/python3.11
は asdf which python
で取得できる。 python
コマンドは ~/.asdf/shims/python
にパスが通っている状態だが、上記の代わりにこのパスを設定しようとすると次のようなエラーが発生する。
asdf はコマンドが実行されたディレクトリに適したバージョンのランタイムを自動的に選択するようになっており、 .asdf/shims
を経由して .asdf/installs
以下に格納されている適切なバージョンのランタイムを呼び出すような動作になっている。ここもシンボリックリンクになっているので、恐らく VS Code がリンクをランタイム本体まで追跡しきれてないのではと推測している。
外部パッケージの補完
virtualenv 方式の場合はこの時点で補完が効くようになっている。
PEP 582 方式の場合は補完が効かないので、 .vscode/settings.json
で次のように設定して __pypackages__
以下にパッケージが配置されていることを IDE に認識させる。
{
"python.autoComplete.extraPaths": ["__pypackages__/3.11/lib"],
"python.analysis.extraPaths": ["__pypackages__/3.11/lib"]
}
IntelliJ IDEA の設定
インタープリタの設定
IntelliJ IDEA の Python SDK の設定を行う。
JetBrains の File から Project Structure を開き、表示されたウィンドウの Project メニューから Python SDK を追加するウィンドウをさらに開く。
System Interpreter メニューの Interpreter のパスに VS Code と同様のパスを設定する。1つ前のウィンドウの SDKs を開き、追加した SDK を選択して Classpath が生成されていることを確認する。
Classpath について
Classpath が未生成の状態だと標準ライブラリ等の補完が効かない。 SDK を新たに作ると自動的に生成されるが、既存の SDK のパスを変更しても生成されないような動作になっていることが筆者の環境で確認されたので要注意。
外部パッケージの補完
ここまでの設定では外部パッケージの補完が効かない。 SDK の Classpath に <your_root_path>/__pypackages__/3.11/lib
を追加することで補完が効くようになる。
終わりに
また別のコツやハマりどころが見つかれば書き足す予定。
Discussion