search
LoginSignup
0

posted at

updated at

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

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-dynloadlibにも作成(シンボリックリンクを作成)
    • →これを試してみる

今回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
  • 確認

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0