【Linux】Python3.10.4 をソースからビルドする方法と、注意点いくつか【Python3.10】

# Python3.10.4 のソールビルド

Python3.10.4 をソースビルドしてみた!
意外とハマる部分が多かったのでメモしておきます。

ちなみに環境はRockyLinux8です

## 準備

```
# dnf -y install make wget libffi-devel zlib-devel readline-devel
```

↑まっさらな状態からだと他にもいるかも。
都度エラーコード見てインストールしてください。

:::note info
ちなみに`readline-devel`が個人的に重要で、
これを先にインストールしてからコンパイルしないと、
対話モードで履歴入力するときにキーボードの矢印キーが使えなくなる。
※下のほうにエラーとして書いたので参考に。
:::

## ソースDL

```
# cd /usr/local/src

# wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz

# tar zxvf Python-3.10.4.tgz
```

## configure ~ make

```
# cd Python-3.10.4
# ./configure --prefix=/usr --enable-optimizations

# make -O -j2

# make -O -j2 install
```

:::note info
- -j は並列処理コア数指定です 2coreのVMなので2を指定しました
:::

## 確認

```
$ python3.10 --version
Python 3.10.4

$ pip3.10 --version
pip 22.0.4 from /usr/lib/python3.10/site-packages/pip (python 3.10)
```

- `python` `pip`だけで3.10になるようにする(オプション)

```
$ vi .bashrc

alias python="python3.10"
alias pip="pip3.10"
```

```
$ source .bashrc
```

## 以下、エラー時のメモ

### インストール時のエラー

#### 1. libffi がない → dnf install -y libffi-devel (makeの時)

```
# make -O -j2
...略...
/usr/local/src/Python-3.10.4/Modules/_ctypes/_ctypes.c:107:10: 致命的エラー: ffi.h: そのようなファイルやディレクトリはありません
...略...

# dnf install libffi-devel
```

#### 2. zlib がない → dnf install -y zlib-devel (make installの時)

```
# make install -O -j2
...略...
zipimport.ZipImportError: can't decompress data; zlib not available
...略...

# dnf install -y zlib-devel
```

### インストール後のエラー

#### 1. pip3.10が動かない

```
$ pip3.10
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Traceback (most recent call last):
  File "/usr/lib/python3.10/subprocess.py", line 69, in <module>
    import msvcrt
ModuleNotFoundError: No module named 'msvcrt'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/pip3.10", line 5, in <module>
    from pip._internal.cli.main import main
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/main.py", line 9, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py", line 10, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py", line 8, in <module>
    from pip._internal.cli import cmdoptions
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py", line 21, in <module>
    from pip._vendor.packaging.utils import canonicalize_name
  File "/usr/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py", line 8, in <module>
    from .tags import Tag, parse_tag
  File "/usr/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py", line 6, in <module>
    import platform
  File "/usr/lib/python3.10/platform.py", line 119, in <module>
    import subprocess
  File "/usr/lib/python3.10/subprocess.py", line 74, in <module>
    import _posixsubprocess
ModuleNotFoundError: No module named '_posixsubprocess'
```

msvcrt と _posixsubprocess というモジュールが無いみたい

ひとまずエラー文`ModuleNotFoundError: No module named 'msvcrt'`でググってみる

[ここ](https://stackoverflow.com/questions/66814603/pip-is-not-working-error-no-module-named-msvcrt)の記事
- msvcrt は Window用のモジュールで、Linuxには存在しないので、コンパイルが間違っているみたい?との内容
- また、アンサーにインストール先の`lib64`にある`/lib-dynload`を`lib`にも作成(シンボリックリンクを作成)
    - →これを試してみる

今回prefixを`/usr`に指定したので、/usr/lib64/python3.10/に`lib-dynload`があった
`lib-dynload`の中を覗いてみると`_posixsubprocess`っぽいのが入ってた

```
# ls | grep posixsub
_posixsubprocess.cpython-310-x86_64-linux-gnu.so
```

ということでシンボリックリンクを作成してみる

```
# ln -s /usr/lib64/python3.10/lib-dynload /usr/lib/python3.10/lib-dynload
```

→治ったｗ

```
$ pip3.10 --version
pip 22.0.4 from /usr/lib/python3.10/site-packages/pip (python 3.10)
```

msvcrtは無くてもOK...？

#### 2. 対話モードで矢印キーが使えない

対話モードでキーボードの↑ボタンを押すと`^[[A`と入力されてしまい、履歴入力できない

```
$ python
Python 3.10.4 (main, May 10 2022, 22:26:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = hoge
>>> ^[[A^[[A (←矢印キーの↑を押すとこうなる)
```

これはreadlineという機能で動いているみたいなので、インストールが必要
ただ、pip install readline で解決するみたいな記事を見かけたけど、
自分の場合インストールしたらバグってPythonが起動しなくなってしまった。

[ここ](https://hivecolor.com/id/61)をみたら、readline-develをLinuxにインストールした状態でコンパイルしたら回避できるらしい

- 再コンパイル

```
# dnf -y install readline-devel

# cd /usr/local/src
# cd Python-3.10.4
# ./configure --prefix=/usr --enable-optimizations
# make -O -j2
# make install -O -j2
```

- 確認

→矢印キーが使えるようになってる！