【Python】Windowsで複数バージョンのPythonを簡単かつクリーンに使う我流ベストプラクティス

1ヶ月振りの投稿です。

仕事柄こういうのはネタがないわけではないのですが、ここしばらく多忙でしてノウハウをここまで持ってくる前に力尽きる毎日を過ごしておりました。

経緯

さて、久々に?Pythonのお話です。WindowsでPythonの環境構築というと何となくAnacondaが主流な印象があって、多分パッケージ管理もcondaを使ってる人が多いんだろうなとは思うのですが、どうもWindows 10とAnacondaの相性が悪いような気がして、色々探っているうちに例によってハマったので綴っておくことにしました。

大まかな指針

  • Anacondaは使わない
  • 複数のPython 3を個別にインストールする
  • 極力、仮想じゃない根っこの環境は弄らない
  • スクリプト実行に必要な依存関係を他の人にも簡単に渡せるようにする

root環境構築

あまり汚したくないとはいえ、最低限のセットアップは必要です。

とりあえず公式から

  • Python 3.6.8
  • Python 3.7.7
  • Python 3.8.2

の64bit版を引っ張ってきました。

で、当然インストーラでPATHは通さないにしても、インタラクティブにお試しで動かしたい時はどうしてもあるので代表で3.7だけはPATHに追加することにしました。

必要な設定は

%LOCALAPPDATA%\Programs\Python\Python37
%LOCALAPPDATA%\Programs\Python\Python37\Scripts

この2つです。

ただし、

%USERPROFILE%\AppData\Local\Microsoft\WindowsApps

この設定よりも上に入れないと実行時に何故かMicrosoftストアが表示されてしまうので要注意です。

pipを更新します。

$ python -m pip install --upgrade pip

virtualenvをインストールします。

$ pip install virtualenv

rootに手を加えるのはここまでです。

仮想環境構築

スクリプトを書くための作業ディレクトリを作り、そこで仮想環境を作成します。

$ python -m virtualenv -p "$env:LOCALAPPDATA\Programs\Python\Python37\python.exe" .env

アクティベートします。

$ .\.env\Scripts\activate

誰かの環境を持ってきたときはこの状態でパッケージを一括インストールします。

(.env)$ pip install -r .\requirements.txt

VSCodeで開発環境を整える

新しくスクリプト実行環境を作っていく場合は以降のパッケージ追加などはVSCodeでやるのがラクです。

.env で仮想環境を作った場合、VSCodeで新しいターミナルを開いた時点で自動でアクティベートが走ると思います。まずこれがめっちゃ便利です。

あとはここでちくちく pip install していって、最後にrequirements.txtを作りましょう。

(.env) $ pip freeze >> requirements.txt

ただしPowerShellでこれを実行するとファイルの文字エンコードがUTF-16 LEになってしまうので、これを手動でUTF-8に変えておきます。これもVSCodeならステータスバー右側の「エンコードの選択」から簡単にできます。なおこの問題はgiboとか使ってても直面するであろう問題です。

あとは初めてPythonファイルを作成したときに「どの環境使いまっか」と聞かれるのでパレットから入力するか .\.vscode\settings.json を以下のように追加すればデバッグも楽チンです。

{
    "python.pythonPath": ".env\\Scripts\\python.exe"
}

間違っても絶対パスなんて馬鹿な真似はやめてください(笑)

これで .gitignore もgiboで作っておけば .env もgitの追跡から除外され、リポジトリにバイナリファイルを置くことなく、requirements.txtを経由して共通化した手順で他の人に同じ環境を提供できるわけです。

どうでしょう。我ながら美しいプロトコルができたな、と思いました。

スクリプトが増えると仮想環境の分ディスクを食ってしまうのはご愛嬌ということでひとつ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です