Python3.10.4 のソールビルド
Python3.10.4 をソースビルドしてみた!
意外とハマる部分が多かったのでメモしておきます。
ちなみに環境はRockyLinux8です
準備
# dnf -y install make wget libffi-devel zlib-devel readline-devel
↑まっさらな状態からだと他にもいるかも。
都度エラーコード見てインストールしてください。
ちなみに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
- -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'
でググってみる
ここの記事
- 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
→治ったw
$ 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が起動しなくなってしまった。
ここをみたら、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
- 確認
→矢印キーが使えるようになってる!