TECHブログ


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.jsonlaunch.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へのパスが意図したものとなっているか確認することがおすすめです。

 

 

 

最後までお読みくださりありがとうございました。