こんにちは、技術開発ユニットの三浦です。データサイエンス関連のWeb記事を眺めていると試してみたいPythonのlibraryを見つけることがあるのですが、実験用の環境を作るのがちょっと手間だな・・・と後回しにしてしまうことが自分にはあります。もっと気軽に色々試すことが出来て、かつ環境の再現性も保たれる方法ってないかな、と調べてみたところ、pyenvとpoetryを使った事例がいくつか見つかったので、自分でも試してみました。
実現したいこと
最初に自分がどんな実験環境を求めているのかを考えてみました。
- 基本は最新のversionのPythonを使いたい(新しい機能に触れたいため)。でも使いたいlibaryが最新のversionに未対応のケースがあるので必要に応じて過去のversionに切り替えて使いたい。
- 何かを実験する際には都度その実験のための環境を用意したい。具体的には使用したPythonのversionとその実験のためにどのlibraryをインストールしたのかを明確にしておきたい。
2をないがしろにして痛い目にあったことが結構あります・・・。面白い実験結果が出て、他の人に共有してもその人の環境で再現することが出来ない、どうやって環境を作ったのかを明確に説明することが出来ない、新しくlibraryをインストールしたら、依存するlibraryのversionもいつの間にか変わってしまい、それまで動いていたコードが動かなくなった・・・など。Dockerを使って環境構築を行っていましたが、イメージを作ってコンテナを起動するのに結構時間がかかるので、もう少し素早く実験環境を作る方法ってないのかな、と考えていました(もちろん私がDockerを使いこなせていないことも原因だと思いますが。)。そこで複数のPythonのversion管理をpyenv、実験(プロジェクト)ごとのlibraryの管理をpoetryで行う構成を試してみました。実際にやってみると詰まる点が何箇所かあり、少し丁寧に残しておきたいのでpyenvの導入とpoetryの導入で記事を分けておこうと思います。今回の記事はpyenvの導入がメインになります。
pyenv
pyenvは同じ端末の中で複数のPythonのversionを管理することが出来るツールです。例えば普段はPython3.10を使っているが、あるプロジェクトで3.8を使いたい場合、pyenvがあればコマンドで簡単にversionの切り替えを行うことが出来るようになります。しばらくWindows向けのものはなかったと思いますが、Windows向けのもの(pyenv for Windows)がGitHubに公開されていました。
poetry
poetryはPythonのプロジェクト単位で使用するlibraryの管理、追加、削除などを行うことが出来るツールです。poetryによってプロジェクトのディレクトリごとに仮想環境を構築し、その中で閉じた形でlibraryを使用することが出来ます。それによりあるプロジェクトでlibraryをインストールしたことで他のプロジェクトに影響を与えてしまう、といった問題を無くすことが出来ます。
OSの情報
Windows10 Homeに構築してみました。
pyenv for Windowsのインストール
Pythonのインストール
pyenv for Windowsをインストールする方法は現在4種類あるのですが、OSにPythonをインストールしてそれに付いてくるpip
を使ってインストールする方法を選びました。pyenv for Windows自体も今後version管理したほうが良いかな・・・という理由と、もう1つの方法であるzipファイルをダウロードして配置するという手順が私の環境ではなぜか上手くいかなかったためです。
Pythonのインストーラはこちらからダウンロードしました。
ダウンロードしたファイルを実行するとインストーラが起動します。ここでインストールするPythonはpyenv for Windowsのインストールに使用するだけの用途なので、Customize installationにて最小構成でインストールしました。
以下、私のインストール時の設定です。
pyenv for Windowsのインストール
先にインストールしたPythonに付いてくるpip
でインストールします。私はインストール時に環境変数のPATH
にPythonのパスを通さなかったので、PowerShellにて以下のように一時的に環境編集PATH
にpip
のパスを通してコマンドを実行しました。
> $ENV:Path="C:\Users\username\AppData\Local\Programs\Python\Python310\Scripts;"+$ENV:Path > pip install pyenv-win --target $HOME\\.pyenv
pip
の場所は作業環境により変わります。
無事にインストールが完了したメッセージを確認後、一度PowerShellを再起動しました。
環境変数の設定
引き続きPowerShellで作業します。まずは環境変数PYENV
, PYENV_HOME
, PYENV_ROOT
の作成から。
[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User") [System.Environment]::SetEnvironmentVariable('PYENV_ROOT',$env:USERPROFILE + "\.pyenv\pyenv-win\","User") [System.Environment]::SetEnvironmentVariable('PYENV_HOME',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
次にユーザー環境変数のPATH
に.pyenv\pyenv-win\bin
と\.pyenv\pyenv-win\shims
を追加します。
[System.Environment]::SetEnvironmentVariable('path', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")
一度PowerShellを終了してからもう一度立ち上げ、pyenv --version
を実行します。pyenv 2.64.11
のように応答があればOKです。
セキュリティ エラー PSSecurityExceptionが出る
pyenv --version
実行時にPSSecurityExceptionのエラーが出た場合、PowerShellの実行ポリシーの変更が必要なようです。最初に私の環境でこのエラーが表示された際、ポリシーをPowerShellでGet-ExecutionPolicy
を実行して確認したところ、Restrictedというスクリプトの実行を許可しない設定になっていました。実行ポリシーをRemoteSignedに変更してもう一度試したころ、エラーが出ずにpyenv
が実行できるようになりました。PowerShellの実行ポリシーやその変更方法などは以下を参照しました。
実行ポリシーの変更によるリスクなども記載されているので、変更前に目を通したほうが良いと思います。
動作確認
ここからはpyenvを実際に使ってその動作や機能を確認してみます。
3.10.0と3.9.8のインストール
まずはpyenvで管理するPythonをインストールしていきます。これからの作業もPowerShellで行います。ここではPython3.10.0と3.9.8をインストールしてみます。GitHubのREADMEのUsageを参考に進めていきます。
まずはpyenvでインストールできるPythonのversionのリストを更新するためにpyenv update
を実行します。更新が完了したら、インストール可能なversionリストをpyenv install -l
を実行して表示します。その中に3.10.0
と3.9.8
があることを確認したら、pyenv install 3.10.0 3.9.8
を実行してまとめて2つのversionのPythonをpyenvの管理下にインストールすることが出来ます。
globalの設定
defaultで3.10.0の方を使用したい場合は、3.10.0をglobalなversionとして設定します。pyenv global 3.10.0
と実行すると設定が出来、設定した内容についてはpyenv versions
を実行して
* 3.10.0 (set by %PYENV_VERSION%) 3.9.8
のように、インストールされているversionと、どのversionのPythonが現在使われているのか("*"がついている方)を確認することが出来ます。
プロジェクトディレクトリの作成とlocal versionの設定
次に、あるプロジェクトでは3.9.8を使用するケースを試してみます。まずプロジェクト用のディレクトリを作成します。次にそのディレクトリの中に入り、3.9.8をlocalなversionとして設定します。
mkdir pyenv-test cd pyenv-test pyenv local 3.9.8
ディレクトリの中に.python-versionというファイルが出来、中身をテキストエディタなどで確認すると、3.9.8とlocalで設定されたversionが書き込まれていることが分かります。localの設定を行った後、一度PowerShellの再起動を行います。再起動をしないと私の環境ではディレクトリを出た後もlocalのversion設定が残り続けていたからです。
version切り替え確認
もう一度PowerShellを起動し、まずは先ほどのプロジェクトディレクトリの外でpyenv versions
を実行します。
* 3.10.0 (set by C:\Users\username\.pyenv\pyenv-win\version) 3.9.8
globalな3.10.0が使用されていることが確認できます。
次にディレクトリの中でpyenv versions
を実行してみると・・・。
3.10.0 * 3.9.8 (set by C:\Users\username\Dev\pyenv-test\.python-version)
ディレクトリの中では3.9.8が使われていることが確認できます。
まとめ
今回はWindowsにPythonの実験環境を作った作業の中からpyenv の導入部分についてご紹介しました。次回はlibrary管理ツールpoetryの導入についてご紹介しようと思います。