【WSL1】pyenvの導入と使用例


投稿日 2022年11月9日 >> 更新日 2022年11月11日

概要

Windows Subsystem for Linux 1のUbuntuにPythonのバージョン仮想化システムであるpyenvを導入します。
pyenv導入に至っての経緯は、WSL1ではどうやらPython3.6.9まででサポートが終了となっているため、Python3.7以降の外部ライブラリをインストールすることができないという理由であります。
pyenvを導入することにより、WSL2にバージョンアップしなくても様々なPythonのバージョンを使用することが可能になりました。

実行環境

実行環境
Windows Subsystem for Linux 1
Ubuntu 18.04.6 LTS
Python 3.6.9

pyenvの導入

公式で紹介されているpyenvの導入手順は以下のGitHubリポジトリを見ると分かりますが、ここでは補足を交えて紹介していきます。

インストール

新しくパッケージを導入する前に、自身のWSL1を最新の状態にしておきます。

$ sudo apt update

$ sudo apt upgrade

バージョン管理ツールのGitを持っている場合はgitコマンドのクローンを使用して、持ってない場合はLinuxコマンドのcurlコマンドで導入します。

gitコマンドの場合

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

Linuxコマンドの場合

$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

インストールが終わると、ホームディレクトリに「.pyenv」ディレクトリが配置されます。
「ls -a」でホームディレクトリ(~)内隠しファイル等を出力します。

ls -a ~
... ... .bash_proflie .bashrc ... ... ... ... .pyenv ... ... ...
... ... ... ...

pyenvをシェル環境に構成

次にWSL1の環境変数にpyenvのセットアップを行います。
まずは手動で行ってから、次回WSL1起動以降にpyenvが自動実行されるように設定ファイルに書き込みます。

環境変数の「PATH」に「\$HOME/.pyenv/bin:\$PATH」を追記します。
語尾の「\$PATH」環境変数によって追記するという設定です。

「\$HOME」は「HOME」という環境変数名で、「\$○○」とすることでその変数の中身を取得することができます。

$ echo $HOME
/home/user/

ではexportコマンドで「PATH」環境変数に追記します。

$ export PATH=$HOME/.pyenv/bin:$PATH

「export」コマンドのオプション「-p」で設定されている環境変数の一覧を確認できます。

$ export -p

そしてevalコマンドで「\$(pyenv init -)」を実行します。

$ eval $(pyenv init -)

「pyenv init -」はpyenvのシェル環境を構成するための出力で、「eval」コマンドによって実際に出力されたコマンドを実行します。

これでpyenvを使えるようになったかと思います。

「pyenv」とコマンドすると、pyenvが実行できるコマンド集を一覧できます。

$ pyenv
pyenv 2.3.6-4-g904fe964
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   --version   Display the version of pyenv
   commands    List all available pyenv commands
...

pyenvのコマンド集はこちらにまとめました。

手動設定では次回のWSL1起動時に設定が無効になってしまうので、設定ファイルにpyenvの環境変数追記と環境の構成実行を書き込んで、自動実行されるようにします。

WSL1の設定ファイル「./bash_profile」を在り処を確認します。

$ ls -a ~
... ... ... .bash_profile .bashrc ... ... ... .pyenv ...
... ... ... ... ...

各自エディターを使って「.bash_profile」を編集します。

$ vi ~/.bash_profile

以下が編集結果です。

...
# pyenvの設定
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

if [[ -f ~/.bashrc ]] ; then
        . ~/.bashrc
fi

これで次回起動時から自動実行されます。

すぐに設定内容を反映させたい場合は「source」コマンドで実行します。

$ source ~/.bash_profile

pyenvの使用

実際にpyenvを実行して特定のPythonバージョンを構築し、更に付属品の「venv」で仮想環境を構築していきたいと思います。

pyenvの便利なコマンド集

コマンド 実行内容
--version pyenv のバージョンを表示
commands 使用可能なすべての pyenv コマンドを一覧表示します
exec 選択した Python バージョンで実行可能ファイルを実行します
global Python バージョンを設定または表示します
help コマンドのヘルプを表示する
hooks 特定の pyenv コマンドのフック スクリプトを一覧表示する
init pyenv のシェル環境を設定します
install python-build を使用して Python バージョンをインストールします
latest 指定されたプレフィックスを使用して、インストールされている最新バージョンまたは既知のバージョンを出力します
local アプリケーション固有の Python バージョンを設定または表示します
prefix Python バージョンのプレフィックスを表示します
rehash pyenv shims を再ハッシュします (実行可能ファイルをインストールした後にこれを実行します)
root バージョンと shim が保持されているルート ディレクトリを表示します
shell シェル固有の Python バージョンを設定または表示します
shims 既存の pyenv shim を一覧表示します
uninstall Python バージョンのアンインストール
version 現在の Python のバージョンとその起源を表示します
version-file 現在の pyenv バージョンを設定するファイルを検出します
version-name 現在の Python バージョンを表示します
version-origin 現在の Python バージョンがどのように設定されているかを説明する
versions pyenv で利用可能なすべての Python バージョンを一覧表示します
whence 指定された実行可能ファイルを含むすべての Python バージョンを一覧表示する
which 実行可能ファイルへのフル パスを表示する

Pythonのインストール

PythonのインストールとなるとPCの性能によっては時間を要するのでどんなバージョンを導入するか吟味したいところです。

私の場合はWSL1にデフォルトで備わっているPython3.6.9ではインストールできなかった「tensorflow」というディープラーニングのライブラリを導入するために、pyenvを使って「Python3.7」以降のバージョンをインストールしたいと思います。

ちなみに、現段階ではどのディレクトリでインストールを開始しても大丈夫です。
インストールを実行したディレクトリがそのPythonの環境になるわけではありません。

pyenvコマンドの「versions」を実行すると、現在のバージョン状況とその一覧を表示できます。

$ pyenv versions
* system (set by /home/user/.pyenv/version)

まだ1項目しかありませんが、アスタリスクが付いている項目が現在実行中のバージョンです。
「system」というのはWSL1のデフォルトで備わっているPython3.6.9を指しています。

インストールできるPythonのバージョンを一覧表示するには「pyenv install -l」とすると表示できます。

以下は「grep」コマンドを併用して「3.7.*」が含まれているバージョンだけを表示するように実行しています。

$ pyenv install -l | grep 3.7.*
  2.3.7
  3.3.7
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
...

上記の結果を参考にして、「Python3.7.0」をインストールしていきます。

$ pyenv install 3.7.0
Downloading Python-3.7.1.tar.xz...
-> https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
Installing Python-3.7.0...
Installed Python-3.7.0 to /home/kenno/.pyenv/versions/3.7.0

正常にインストールできれば上記のような結果となりますが...

以下のような「WARNING」文が出力された場合はこちらの「【pyenv】pythonビルド後のModuleNotFoundError: No module named '_sqlite3'」をご参照ください。

$ pyenv install 3.7.0
Downloading Python-3.7.0.tar.xz...
-> https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
Installing Python-3.7.0...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python curses extension was not compiled. Missing the ncurses lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
WARNING: The Python tkinter extension was not compiled and GUI subsystem has been detected. Missing the Tk toolkit?
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.7.0 to /home/kenno/.pyenv/versions/3.7.0

インストールが完了したら「versions」コマンドを実行して確認してみます。

$ pyenv versions
* system (set by /home/user/.pyenv/version)
  3.7.0

バージョンを切り替える

単に現在のデフォルトで使用できるPython3.6.9からpyenvによってインストールしたPython3.7.0へ切り替えるだけなら「global」コマンドで切り替わります。

$ python3 -V
Python 3.6.9

$ pyenv global 3.7.0

$ python3 -V
Python 3.7.0

現在実行中のバージョンを確認すると、アスタリスクが「3.7.0」の項目にある事が分かります。

$ pyenv versions
  system
* 3.7.0 (set by /home/user/.pyenv/version)

ただしこれではシステム自体のPythonが切り替わっているだけなので、バージョンごとに管理したい場合は以下の方法があります。

バージョンごとに管理する

バージョンごとに管理したい場合は、その目的のディレクトリを作成し、その作業ディレクトリで「pyenv local」コマンドを実行します。

$ mkdir python-3.7.0

$ cd python-3.7.0

python-3.7.0$ pyenv local 3.7.0

実行されたら、その作業ディレクトリに「.python-version」というテキストファイルが作成されます。

python-3.7.0$ ls
.python-version

pyenvはこの「.python-version」を読み込んでバージョンを管理しているのだと思われます。
実際にバージョンを確認してから「venv」で仮想環境を構築してみます。

python-3.7.0$ python3 -V
Python 3.7.0

python-3.7.0$ python3 -m venv venv3.7

python-3.7.0$ ls
venv3.7

python-3.7.0$ source venv3.7/bin/activate

(venv3.7) python-3.7.0$

これで目的のPythonライブラリであった「tensorflow」をインストールすることができました。

(venv3.7) python-3.7.0$ pip install tensorflow

(venv3.7) python-3.7.0$ pip freeze
...
tensorflow==2.10.0
...

以上となります。

最後までご覧いただきありがとうございました。