CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Pythonの実験環境をWindows PCにpyenv+poetryで作りました。(pyenv導入編)

こんにちは、技術開発ユニットの三浦です。データサイエンス関連のWeb記事を眺めていると試してみたいPythonのlibraryを見つけることがあるのですが、実験用の環境を作るのがちょっと手間だな・・・と後回しにしてしまうことが自分にはあります。もっと気軽に色々試すことが出来て、かつ環境の再現性も保たれる方法ってないかな、と調べてみたところ、pyenvとpoetryを使った事例がいくつか見つかったので、自分でも試してみました。

実現したいこと

最初に自分がどんな実験環境を求めているのかを考えてみました。

  1. 基本は最新のversionのPythonを使いたい(新しい機能に触れたいため)。でも使いたいlibaryが最新のversionに未対応のケースがあるので必要に応じて過去のversionに切り替えて使いたい。
  2. 何かを実験する際には都度その実験のための環境を用意したい。具体的には使用した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に公開されていました。

github.com

poetry

poetryはPythonのプロジェクト単位で使用するlibraryの管理、追加、削除などを行うことが出来るツールです。poetryによってプロジェクトのディレクトリごとに仮想環境を構築し、その中で閉じた形でlibraryを使用することが出来ます。それによりあるプロジェクトでlibraryをインストールしたことで他のプロジェクトに影響を与えてしまう、といった問題を無くすことが出来ます。

python-poetry.org

OSの情報

Windows10 Homeに構築してみました。

pyenv for Windowsのインストール

Pythonのインストール

pyenv for Windowsをインストールする方法は現在4種類あるのですが、OSにPythonをインストールしてそれに付いてくるpipを使ってインストールする方法を選びました。pyenv for Windows自体も今後version管理したほうが良いかな・・・という理由と、もう1つの方法であるzipファイルをダウロードして配置するという手順が私の環境ではなぜか上手くいかなかったためです。

Pythonのインストーラはこちらからダウンロードしました。

www.python.org

ダウンロードしたファイルを実行するとインストーラが起動します。ここでインストールするPythonはpyenv for Windowsのインストールに使用するだけの用途なので、Customize installationにて最小構成でインストールしました。

以下、私のインストール時の設定です。

f:id:miu4930:20211108231108p:plain
設定画面1

f:id:miu4930:20211108231236p:plain
設定画面2

pyenv for Windowsのインストール

先にインストールしたPythonに付いてくるpipでインストールします。私はインストール時に環境変数のPATH にPythonのパスを通さなかったので、PowerShellにて以下のように一時的に環境編集PATHpipのパスを通してコマンドを実行しました。

> $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の実行ポリシーやその変更方法などは以下を参照しました。

docs.microsoft.com

実行ポリシーの変更によるリスクなども記載されているので、変更前に目を通したほうが良いと思います。

動作確認

ここからは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.03.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の導入についてご紹介しようと思います。