うどん県出身グーナーの呟き

神奈川県在住のグーナーです。プログラムをやっているので勉強していることや作った便利ツールを公開したいと思います。

【Python】【pyenv】pyenv-winとWSL内のpyenvが干渉したので直してみた

pyenv-winとWSL内のpyenvが干渉したので直してみたよ

概要

先日以下の記事で書いたように、Windowspythonを入れていなかったのでpyenv-winをインストールしました。

ryo-udon.hatenadiary.jp

ただ正直Windowsでの動作確認程度の用途しかなく、そろそろ20.04のWSL環境にもpyenvを入れて運用しようとしてみたら、

あれ?動かなくない?

そう。動かないのです。

正確には~/.bashrcにpyenvのパスを設定するのですが、その際に以下のようなエラーがでます。

bash: /mnt/c/Users/pastm/.pyenv/pyenv-win/bin/pyenv: /bin/sh^M: bad interpreter: No such file or directory
HOME: command not found
bash: /mnt/c/Users/pastm/.pyenv/pyenv-win/bin/pyenv: /bin/sh^M: bad interpreter: No such file or directory

ん?pyenv-win?なぜpyenv-winを見に行くの?

どうやらWindows側の環境変数を参照しているらしく、pyenv-winの際に設定したPYENV_ROOTとPATHに引っ張られてwindows側のpyenvにアクセスしてしまっているようです。

というわけで今回はその解決方法を見つけたので備忘録がてら書いていきたいと思います。

直し方

先に直し方を説明します。

ちなみにこれは先にpyenvのインストール手順を踏んだ後に実行しても問題ありません。(あくまでPATHの問題なため)

直し方はこちらのredditの記事を参考にしました

直し方はシンプル。

/etc/profile に以下の一文を追加するだけ。

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/snap/bin"

何をしているかというと、単純にPATHをここで上書きしています。

後は

source /etc/profile
source ~/.bashrc

でこのPATH問題は解決します。

ついでにpyenvのWSL2 Ubuntu20.04へのインストール手順

こちらは何度も焼き増しされていますが、こちらの記事を参考にしました。

まずは各update, upgrade(久々に起動したせいか、かなりの量があってびっくり)

sudo apt update
sudo apt upgrade

次に各種ライブラリのインストール

sudo apt install -y build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev libopencv-dev tk-dev git

次はpyenvの本体のインストール。UbuntuなどのLinuxではgitからリポジトリをクローンしてきます。

ここでは丁度一週間前にv2.3.1がリリースされていたのでこちらにしました。

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

cd ~/.pynev

git checkout v2.3.1

最後に問題になった各種PATHの設定

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(pyenv init --path)"' >> ~/.bashrc

source ~/.bashrc

これでインストールは完了です。

最後に

というわけで最初はpyenvが使えなくて焦りましたが、結論から言えば割と簡単に直すことができました。

また何か不具合などがあれば随時更新したいと思います。

ではでは。

/*コードブロックに言語名を表示*/ pre.code:before { content: attr(data-lang); display: inline-block; background: white; color: #666; padding: 3px; position: absolute; margin-left: -10px; margin-top: -30px; } pre.code { padding-top: 30px !important; }