はじめに
Ubuntu Server 20.04でわけあってPython3.6をインストールしようとしたら、
いろいろ大変だったので備忘録としてここに残そうと思う
ネットでよく見るapt
からする方法(失敗した方法)
Ubuntuでは一般的に何らかのパッケージをインストールするときはapt
パッケージマネージャーを使うが、
Ubuntu 20.04でのapt
の公式リポジトリからはすでにPython3.6がなくなっている
ネットでは、Python3.6を提供しているPrivate Package Archiveであるdeadsnake/ppa
をリポジトリに追加してapt install python3.6
することでこれを解決している記事が多いが、
自分の環境ではリポジトリの追加まではできても、python3.6というパッケージがレポジトリに追加されることは無かった
これは、deadsnake/ppa
のドキュメントを見る限り、
Ubuntu 20.04ではPython 3.6がサポート対象外になっているからだと考えられる
一応こちらの方式でのやり方も記述しておく
1. deadsnake/ppa
をapt
リポジトリへ追加
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
2. Python 3.6のインストール
sudo apt install python3.6
Python公式のソースコードからインストールする方法(成功した方法)
apt
からインストールすることができなかったので、初心に帰って(?)ソースコードからコンパイルしてインストールすることにした
実際のやり方はこちらを参考にして以下の手順で行った
1. インストールに必要な依存関係をインストール
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
2. ソースコードのダウンロード
Ubuntuでは/tmp
がダウンロードしたプログラムのソースコードを一時的に置く場所として一般的らしいのでそこにダウンロードしてくる
cd /tmp
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz
3. ソースコードの解凍
tar -xf Python-3.6.15.tgz
4. システムの検証とPythonの最適化
cd Python-3.6.15
./configure --enable-optimizations
5. Pythonのインストール
公式ドキュメントにもあったが、make install
でもインストールできるが、既存のPython3バイナリを上書きしてしまう可能性があるので、以下のコマンドで、/usr/bin/python3.6
のみをインストールした
sudo make altinstall
...するとなぜか、Python3.6.15の場合Segmentation faultが起きて途中でインストールもといコンパイルが終了する
6. Segmentation faultへの対処
ここで(も)先人の知恵をお借りして、この方がやったように外部からのパッチファイルを適用してコンパイルを実行する
ただ、この方はpyenv install
のpオプションを利用してパッチ、コンパイルを行っているが、こちらはそうではないため、直にパッチをあてる
といってもやることは愚直に、当該ファイルを書き換えるだけで具体的には以下の二つをやるだけ
-
./Include/objimpl.h
の258行目のdummy変数の型をlong doubleに変更 -
./Objects/obmalloc.c
の653行目以降をこのように変更
そして、再度sudo make altinstall
して無事 /usr/local/bin
内にインストール完了!