概要
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の導入手順は以下の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 ... ... ...
... ... ... ...
次に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を実行して特定のPythonバージョンを構築し、更に付属品の「venv」で仮想環境を構築していきたいと思います。
コマンド | 実行内容 |
---|---|
--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のインストールとなると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
...
以上となります。
最後までご覧いただきありがとうございました。