【CentOS 7 / pyenv】サーバー環境のPythonバージョンアップデート

# はじめに
サーバー環境のPythonのバージョンをアップデートする時の流れをまとめました。
初心者向けにはなりますが、つまづいたところも書き留めているので、同じところで悩んでる方の助けになれば幸いです。

# 環境
* CentOS 7
* pyenv

# Pythonのバージョン変更の流れ
[1. 現在のPythonバージョンを確認](#1-現在のpythonバージョンを確認)
[2. pyenvでインストール可能なPythonバージョンを確認](#2-pyenvでインストール可能なpythonバージョンを確認)
[3. バージョンを指定してpythonをインストール](#3-バージョンを指定してpythonをインストール)
[4. pyenv内のpythonのバージョン切り替え](#4-pyenv内のpythonのバージョン切り替え)
[5. 現在のpythonバージョンを確認](#5-現在のpythonバージョンを確認)

[つまずいたところの解決方法まとめ](#つまずいたところの解決方法まとめ)

## 1. 現在のPythonバージョンを確認
現在サーバーで参照されているPythonのバージョンを確認します。

:::note warn
ユーザーごとにバージョンが異なる可能性があるので、pyenvがインストールされているユーザーでの確認をしてください。
:::

```:コマンド
python -V
```  

<br>

ついでにpyenvにインストールされているPythonのバージョンも確認します。
現在のバージョンには`*`がついています。

```:コマンド
pyenv versions
``` 

## 2. pyenvでインストール可能なPythonバージョンを確認
```:コマンド
pyenv install --list
``` 
pyenvはPython以外もインストールできます。
表示された一覧の上部にある、`2.**.**`や`3.**.**`がPythonのバージョンです。

<font color="LightCoral">インストールしたいバージョンがないとき</font>→[つまずいたところの解決方法](#1-インストールしたいバージョンがないとき)へ


## 3. バージョンを指定してPythonをインストール

```:コマンド
pyenv install 3.**.**
``` 
インストールしたいバージョンを選択してください。

Python3.10以上のインストールで<font color="LightCoral">OpenSSLエラー</font>が出たとき→[つまずいたところの解決方法](#2-python310以上のインストールでopensslエラーが出たとき)へ



## 4. pyenv内のpythonのバージョン切り替え
再度、pyenvにインストールされているPythonのバージョンを確認すると、先ほどインストールしたバージョンが増えています。
```:コマンド
pyenv versions
``` 

続けて、`pyenv global`コマンドでインストールしたバージョンに切り替えます。

```:コマンド
pyenv global 3.**.**
``` 
>オプションにglobalとあるので、システム全体の設定が切り替わりそうに見えますが、実際は実行しているユーザの環境のみに影響を与えます。

([[python]pyenvがバージョンを切り替える仕組みを理解する](https://akamist.com/blog/archives/2610)より引用)


もう一度`pyenv --version`で確認すると、切り替えたバージョンに`*`がついています。

## 5. 現在のPythonバージョンを確認
最後に、現在サーバーで参照されているPythonのバージョンを再度確認します。

```:コマンド
python -V
```  
<br>

**以上で、サーバー環境のPythonバージョンのアップデートが完了です！**

<br>

## つまずいたところの解決方法まとめ

#### 1. インストールしたいバージョンがないとき
:::note
**解決方法**
pyenvのバージョンアップをする。
1. 現在のpyenvバージョン確認
1. pyenvの該当ディレクトリの確認
1. pyenvのgitをpull
1. pyenvバージョンが上がったことを確認
:::

<br>

- 現在のpyenvバージョン確認
```:コマンド
# pyenv --version
``` 

<br>

- pyenvの該当ディレクトリの確認
```:コマンド
pyenv which python-build
```

<br>

- pyenvのgitをpull
:::note warn
`{}`内に上記のディレクトリの`/plugins/python-build`より前のパスを入力してください。
:::
```:コマンド
cd /{**}/plugins/python-build/../.. && git pull && cd -
``` 

<br>

- pyenvバージョンが上がったことを確認
先ほど確認したバージョンから上がっていることがわかります！

```:コマンド
# pyenv --version
``` 
<br>

**再度、`pyenv install --list`コマンドでインストール可能なPythonバージョンを確認すると、最新のバージョンまででてきました！**

----

#### 2. Python3.10以上のインストールで<font color="LightCoral">OpenSSLエラー</font>が出たとき

:::note
**解決方法**
OpenSSL 1.1.1のインストール
:::

Python3.10をインストールしようとしたところ、下記のエラー文が出ました。
```:エラー
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
``` 
<br>

[python.jp](https://www.python.jp/news/wnpython310/require-openssl11.html)によると、

>これまで、Pythonでは OpenSSL のVersion 1.0.2以降が利用可能でしたが、Python 3.10からは、OpenSSL 1.1.1以降が必須となりました(PEP 644 Require OpenSSL 1.1.1 or newer)。

とのこと...。

エラー文下部の [https://github.com/pyenv/pyenv/wiki/Common-build-problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems) には下記のコマンドがあったため、この通りに打ち、

>- If you need OpenSSL 1.1:
>```:コマンド
>sudo yum install openssl11-devel --allowerasing
>```

**無事にPython3.10をインストールできました！**

<br>

### 参考
[[python]pyenvがバージョンを切り替える仕組みを理解する](https://akamist.com/blog/archives/2610) 
[pyenvのバージョンをupdateする](https://shikasen-engineer.com/pyenv_update/)
[pyenv のアップデート方法](https://zenn.dev/utah/articles/6b4c5cec60c45b) 
[Python 3.10の新機能(その8） OpenSSL 1.1.1が必須に](https://www.python.jp/news/wnpython310/require-openssl11.html) 
[Common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems)