VS CodeでWorkspace毎に使用するPython実行環境を切り替える
2022年5月6日 記事全体を修正しました。
はじめに
弊社ではプロジェクト(案件)によって以下のPython実行環境を使い分けています。
- Python 2.7
- Python 3.5
- Python 3.5(アプリケーションスイートに含まれているもの)
- Python 3.6
- Python 3.7 (64bit)
- Python 3.7 (32bit)
- Python3.8
- Python3.9
開発環境(Visual Studio Code)で複数のPython実行環境を切り替える方法を紹介します。
前提
開発環境
開発環境は以下です。
- Windows 10
- Visual Studio Code(Pythonの拡張機能は導入済)
- Windowsの環境変数にPython実行環境のディレクトリのパスを設定しない
- プロジェクト(案件)毎にディレクトリ(以下プロジェクトディレクトリ)を分け、プロジェクトディレクトリをVisual Studio CodeからWorkspaceとして開く
やりたい事
開発時は以下のターミナル実行とデバッグ実行をやりたいので設定を行います。
- Visual Studio Codeのターミナルから、任意のPython実行環境を使用してPythonスクリプトを実行する
- Visual Studio Codeで、任意のPython実行環境を使用してPythonスクリプトをデバッグ実行する
任意のPython実行環境を使用するための設定
.vscode ディレクトリの作成
任意のPython実行環境を使用するための設定ファイル(settings.json
とlaunch.json
)は、プロジェクトディレクトリ直下に .vscode ディレクトリを作成しその下に配置します。
プロジェクトディレクトリ
└─.vscode
├── settings.json
└── launch.json
settings.json の作成
ターミナルから任意のPython環境を使用するためのsettings.json
を作成します。
{
"files.eol": "\n",
"terminal.integrated.env.windows": {
"PATH": "Python実行環境のパス;${env:PATH}"
}
}
"files.eol": "\n"
は、新規ファイルの改行コードが\n
になるようにしている。terminal.integrated.env.windows
は、WindowsのVSCodeターミナルにおいて使用する環境変数を設定している。
例えば、使用するPython実行環境(python.exe)がC:\\Python\\Python39
にある場合は以下のように設定します。
{
"files.eol": "\n",
"terminal.integrated.env.windows": {
"PATH": "C:\\Python\\Python39;C:\\Python\\Python39\\Scripts;${env:PATH}"
},
}
プロジェクト内共通モジュールパスなどの指定
プロジェクト共通のモジュールをlibディレクトリにまとめている場合など、読み込みたい共通のディレクトリがある場合は以下のように、"PYTHONPATH":
設定を使用します。
{
"files.eol": "\n",
"terminal.integrated.env.windows": {
"PATH": "C:\\Python\\Python39;C:\\Python\\Python39\\Scripts;${env:PATH}",
"PYTHONPATH": "${env:PYTHONPATH};${workspaceFolder}\\lib"
},
}
launch.json の作成
デバッグ実行用の設定ファイル、launch.json
を作成します。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${fileDirname}",
"python": "pythonインタプリタへの絶対パス"
}
]
}
"cwd": "${fileDirname}"
の設定により、Pythonスクリプトあるディレクトリからデバッグ実行する。"cwd": "${fileDirname}"
の設定がない場合は、${workspaceFolder}
(プロジェクト ディレクトリ直下)からデバッグ実行する。"python":
項目にデバッグ用Pythonインタプリタの絶対パスを指定することができる。- 記載しない場合はワークスペース設定が使用される。
venvを使用した環境の場合
venvを使用している場合は、settings.json
を以下のようにします。
{
"files.eol": "\n",
"terminal.integrated.env.windows": {
"PATH": "${workspaceFolder}\\venv\\Scripts;${env:PATH}"
},
"python.defaultInterpreterPath": "${workspaceFolder}\\venv\\Scripts\\python.exe"
}
備考
python.pythonPath設定について
2021年7月以降、.vscode/settings.json
に記載するpython.pythonPath
項目は非推奨になりました。
類似の設定項目として、settings.json
にはpython.defaultInterpreterPath
を記述することができ、Pythonインタプリタを直接指定したい場合は、この項目に記載することができます。(venvを使用した環境の場合 コード参照)
ただし、Visual Studio Codeで初めてWorkspaceのPythonファイルを開いた際に、手動でPythonインタプリタを設定すると、そのインタプリタPATHが優先され、settings.json
に記載のpython.defaultInterpreterPath
は無効になるので注意が必要です。
同様にvenvを使用して仮想環境を構築する際にも、Visual Studio CodeがPython仮想環境を検出し、その環境を使用するかどうか尋ねられる通知が出ます。
もし指定したPythonインタプリタ設定を取り消したい場合は、Ctrl + Shift + p
でコマンドパレットを表示させ、Python: Clear Workspace Interpreter Setting
コマンドを使用し、設定をクリアしてください。
プロジェクトをチームで共有する際のpythonインタプリタ指定における課題
python.pythonPathが非推奨となった経緯について、2021年7月のVSCodeリリースノート(参考1)では、以下のように記載されています。
~ the interpreter path is often very specific to a machine, that behavior was problematic for those who wanted to share their VS Code workspace settings in a GitHub repo ~
インタプリタへのpathがマシンごとに固有の値となるため、githubリポジトリでsettings.jsonを共有したい人たちにとっては問題のある挙動であった」(筆者訳)
上記のリリースノート内で参照されているgithub issueのやりとりの中では、
「settings.jsonにおけるpython.pythonPathの値を${workspaceFolder}/.venv
としたらどうか」
という解決方法が提示されています。
この方法では、settings.jsonにおける記述はマシン固有の値ではなくなるものの、作業者が構築したvenv環境のPythonバージョンが異なることも考えられます。そのため、現在のような、ユーザーにインタプリタを指定させる挙動になったのだと思います。
なお、手動で指定したインタプリタの設定は、Visual Studio Codeの内部ストレージに保存されているそうです。(参考2)
ワークスペースをまるごとチームで共有する場合は、Docker環境などを検討してみてもよいかもしれません。
参考:
1. Python in Visual Studio Code – July 2021 Release //2021年7月リリースノート
2. AB Experiments //VSCodeの設定画面でpython.defaultInterpreterPath
の項目に記載されているリンク
“PATH”の読み込み順に関する補足
本記事の初稿投稿時では、venv環境におけるsettings.jsonの”PATH”を以下のように記載していました。
"PATH": "${env:PATH};${workspaceFolder}\\venv\\Scripts"
しかしこのように設定を記述した状態で2019/11にpythonコマンドを実行したところ、Microsoft Storeが表示されてしまう現象が起きました。
この現象は、${env:PATH}
で走査されるディレクトリのうち、
"C:/Users/[user]/AppData/Local/Microsoft/WindowsApps"
以下に、ストアへ接続される”python.exe”ファイルが存在していることが原因でした。
どこかのwindows Updateでファイルが追加されたのかもしれません。
PATHは左側に記載されたものから順に読み込まれるので、使用したいPython.exeが存在するPATHを先頭に記載することで、この現象は回避できます。
"PATH": "${workspaceFolder}\\venv\\Scripts;${env:PATH}"
ただし、workspaceのPython PATHがうまく通っていない状態で、かつWindowsシステムでのPython PATHが通ってしまっているときなど、意図しないPythonインタプリタが選択されていることに気づくことが難しくなってしまいます。
実行コマンドのフルパスを表示するwhich python
コマンド(Bashなど)、gcm python
コマンド(PowerShell)、もしくはPythonのバージョンを表示するpython -V
を入力し、Pythonへのパスが意図したものとなっているか確認することがおすすめです。
最後までお読みくださりありがとうございました。