強欲で謙虚なツボツボ

趣味の読書の書の方

【環境構築】Ubuntuでもpyenvでpythonを扱いたい

概要

普段はmacを使用していてpythonはhomebrewによってインストールしたpyenvを用いて扱っている。macpythonをインストールする記事でも大抵はpyenvを紹介している。
windowsのPCからmacで作成したソースコードを操作することもしばしばあるので、同様の操作によって扱えるようにするためにpyenvをインストールする。

windowsUbuntu(WSL2)を使えるようにする手順は以下記事の下部に書いた。

taopo.hatenablog.com

 

手順

説明を省いた手順。手順の詳細が必要な場合はここから

# install pyenv
$ curl https://pyenv.run | bash

$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

# WSL2でインストールしたUbuntuを使用している場合は、curlではなくwgetを使用するようにパッケージのソースコードに手を加える
$ vi ~/.plugins/python-build/bin/python-build
detect_http_client() {
  local client
  # for client in aria2c curl wget; do    この行をコメントアウト
  for client in aria2c wget curl; do      この行を追加
    if type "$client" &>/dev/null; then
      echo "$client"
      return
    fi
  done
  echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2
  return 1
}

# pyenvの依存関係を満足させる
$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

# install python by pyenv
$ pyenv install 3.9.9
$ pyenv local 3.9.9

 

pyenvをインストール

gitに公開されているので手順に従うのみ。
https://github.com/pyenv/pyenv#installation

Ubuntuなので、Automatic installerもしくはBasic GitHub Checkoutから好きな方を選べばよいと思う。僕はAutomatic installerにした。
https://github.com/pyenv/pyenv-installer

$ curl https://pyenv.run | bash

下記を.bashrc(.zshrc)に追記。

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

 

pyenvの使い方はこちらを参照。
local, global, install, versions 辺りをよく使う。

github.com

 

pyenv install x.x.xを実行したときのエラー対応

pyenv install x.x.xを実行するとエラーが出て失敗するので以下の対応をしておく。

1つ目(おそらくWSL2でインストールしたUbuntuを使用している場合のみ)

WSL2でインストールしたUbuntuを使用している場合、pyenvでpythonをインストールする際のcurlが悪さをして上手くいかない。(以下のようにtimeoutして失敗します。)

f:id:taopo:20211222022418j:plain

wgetであれば通るということなので、pyenvのソースコードの一部差し換えを行う。

pyenvがインストールされた~/.pyenv内をdetect_http_clientで検索すると、plugins/python-build/bin/python-buildに該当箇所があるとわかるので、以下のように差し換える。

detect_http_client() {
  local client
  # for client in aria2c curl wget; do
  for client in aria2c wget curl; do
    if type "$client" &>/dev/null; then
      echo "$client"
      return
    fi
  done
  echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2
  return 1
}

こちらが参考になりました。WSLでのUbuntuに関する他の対応も書かれているので参考になる人が多そうです。

koideforest.hatenadiary.com

2つ目(依存パッケージをインストール)

次に依存関係が満たされていないとmake: command not foundのように失敗するのでmake等をインストールするが、pyenvが依存するパッケージは公式に明記されているのでこれに従ってインストールする。

$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

 

pythonをインストール

最後にpyenvを使ってpythonをインストールする。インストール可能なpythonのバージョンはpyenv install --listで確認できる。

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

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

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

$ pyenv local 3.9.9
$ pyenv versions
  system
* 3.9.9 (set by /mnt/c/Users/username/Program/salesman/.python-version)

$ python -V
Python 3.9.9

$ pip -V
pip 21.2.4 from /home/username/.pyenv/versions/3.9.9/lib/python3.9/site-packages/pip (python 3.9)

これにて完了。