Python Windows

Ubuntu(WSL)にpyenvとPipenvの環境を構築する

WindowsでPythonを使うためにWSLを有効してUbuntuをインストールしました。

その後、Ubuntuのターミナル環境を改善するためにWindows Terminalで操作できるようにしたり環境を改善してきました。

今回はWSL上のUbuntuにPythonの実行環境を構築していきます。

構築する環境

Pythonの実行環境もいろいろな方法があって当然流行り廃りもあると思いますが、今回はPython環境の切り替えにpyenv、ライブラリ管理にPipenvを使うことにしました。
ただ何がベストプラクティスなのかはわかっておりません。

pyenvとPipenvのインストール方法

WSL上のUbuntuです。

事前作業

pyenvは基本的にはPythonのソースをダウンロードしてコンパイルしますので、ビルド環境が必要となります。
予め以下のパッケージをインストールしておきます。


sudo apt install -y \
  zlib1g-dev \
  libssl-dev \
  libbz2-dev \
  libffi-dev\
  libreadline-dev \
  libsqlite3-dev

pyenvのインストール方法

続いてpyenvをインストールします。
最後にpyenv versionsを実行します。まだ何もpyenvで管理されているPythonがないと思いますので、コマンドが見つからないというエラーでなければ問題ないです。


# pyenvをクローンする
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# pyenvの環境設定に追加する
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

# 設定を反映させる
source ~/.bashrc

pythonのインストール方法

Pythonをインストールします。
今回は3.8.2をインストールしました。


# Python 3.8.2をインストールする
pyenv install 3.8.2

# インストールされているバージョンを表示する
pyenv versions

# 3.8.2をデフォルトにする
pyenv global 3.8.2

# Pythonのバージョンを確認する(3.8.2と表示される)
python --version

Pipenvのインストール方法

まずはじめにpip自体をアップデートしてから、その後pipコマンドでpipenvをインストールします。


pip install --upgrade pip
pip install pipenv

 

動作確認

最後に動作確認です。
使い捨てなので、どこか適当なディレクトリに移動してpipenv --python 3.8.2を実行します。
すると謎のエラーが発生します。


Traceback (most recent call last):
  File "/home/beeete2/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 159, in _create_subprocess
    c = _spawn_subprocess(cmd, env=env, block=block, cwd=cwd,
  File "/home/beeete2/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/vendor/vistir/misc.py", line 134, in _spawn_subprocess
    return subprocess.Popen(cmd, **options)
  File "/home/beeete2/.pyenv/versions/3.8.2/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/home/beeete2/.pyenv/versions/3.8.2/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/mnt/c/Users/user/AppData/Local/Microsoft/WindowsApps/python.exe'

WSLのUbuntuをあんまり理解できていないので理屈がわからないのですが、なぜかWindowsのPythonを参照しようとしているようです。
なおWindowsにPythonをインストールしたことはありません。
このフォルダを開くとpython.exepython3.exeなどの0kbのファイルがあって、なんとなくwt.exeとかubuntu1804.exeとかあるのでおそらくWindows Storeのフォルダだと思われます。
ちなみに、このフォルダにあるpython.exeを実行するとWIndows Storeが表示されるので、おそらくそうなのだと思います。
WIndows StoreからPythonを検索したことはありますがインストールしたことはないので標準で存在するのかは不明です。
お手上げなので検索すると同様の現象が発生した方がおられました。
WSLのpipenv install時になぜかWindows側のpythonが呼ばれる件
WSL : Python executable coming from outside... and failing.
pyenvの直接の問題ではないらしいのですが、恒久的な対応策は現時点ではなくて取り急ぎpipenvの--pythonで指定するPythonをフルパスで指定すれば回避可能なようです。
GitHub上ではこのIssueはクローズされているのですがクローズ後も続いていてWindowsの設定でアプリ実行エイリアス(App execution Aliases)を無効にする方法もあるよと紹介されています。
今回はこの方法で対応しました。
Windows設定 > アプリ実行エイリアスを開きます。
するとアプリの一覧が表示されるので、この中からアプリインストーラーのpython.exepython3.exeオフにします。
(下の画像ではオンになっていますが、オフにします。)

オフにしたら再びpipenv --python  3.8.2を実行すると正常に完了してPipfileが生成されます。

まとめ

うまくいかないことも多々あるかと思いましたがWSL上でもPythonの開発環境を整えることができました。
Pythonの実行バージョンを変更したい場合はPyenvだと簡単に行えるので、Windowsに直接Pythonをインストールするよりやりやすいと思います。

-Python, Windows
-

© 2020 ビー鉄のブログ Powered by AFFINGER5