WindowsでPythonを使うためにWSLを有効してUbuntuをインストールしました。 Windows Subsystem for Linux(WSL)を有効にしてUbuntuをインストールします。 Windows Subsystem for Linux(WSL)の有効化方法 Hyper ... 続きを見る
Windows Subsystem for Linux (WSL)の設定とUbuntuのインストール方法
その後、Ubuntuのターミナル環境を改善するためにWindows Terminalで操作できるようにしたり環境を改善してきました。 Python環境を整えるためにWSLを有効にしてUbuntuをインストールしました。 詳細はWindows Subsystem for Linux (WSL)の設定とUbuntuのインストール方法をご ... 続きを見る
Windows TerminalでWSL Ubuntuの環境を整える
今回はWSL上のUbuntuにPythonの実行環境を構築していきます。
構築する環境
Pythonの実行環境もいろいろな方法があって当然流行り廃りもあると思いますが、今回はPython環境の切り替えにpyenv
、ライブラリ管理にPipenv
を使うことにしました。
ただ何がベストプラクティスなのかはわかっておりません。
pyenvとPipenvのインストール方法
WSL上のUbuntuです。
事前作業
pyenvは基本的にはPythonのソースをダウンロードしてコンパイルしますので、ビルド環境が必要となります。
予め以下のパッケージをインストールしておきます。
sudo apt install -y \
build-essential \
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.exe
やpython3.exe
などの0kbのファイルがあって、なんとなくwt.exe
とかubuntu1804.exe
とかあるのでおそらくWindows Storeのフォルダだと思われます。
ちなみに、このフォルダにあるpython.exeを実行するとWIndows Storeが表示されるので、おそらくそうなのだと思います。
WIndows StoreからPythonを検索したことはありますがインストールしたことはないので標準で存在するのかは不明です。
お手上げなので検索すると同様の現象が発生した方がおられました。
[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.exe
とpython3.exe
をオフにします。
(下の画像ではオンになっていますが、オフにします。)
オフにしたら再びpipenv --python 3.8.2
を実行すると正常に完了してPipfile
が生成されます。
まとめ
うまくいかないことも多々あるかと思いましたがWSL上でもPythonの開発環境を整えることができました。
Pythonの実行バージョンを変更したい場合はPyenvだと簡単に行えるので、Windowsに直接Pythonをインストールするよりやりやすいと思います。