sudoなしでUbuntuにPython3.7インストール

管理者権限がない環境でPython3.7(+jupyter)をインストールするのに意外と苦労したので、自分用にメモを残しておきます。OSはUbuntu18.04LSです。
(2022/6/8 ミスがあったので更新した)

$HOME/local/python/にインストールすると仮定しています。まず、次のようにPythonのソースをwgetしてインストールすると失敗しました。
# 失敗例1
```terminal
mkdir -p $HOME/local/python
wget http://www.python.org/ftp/python/3.7.16/Python-3.7.16.tgz
tar -zxvf Python-3.7.16.tar.gz
cd Python-3.7.16
./configure --prefix=$HOME/local/python --enable-optimizations
make -j 10
make altinstall
```
ModuleNotFoundError: No module named '_ctypes'
というエラーが出ました。どうやらlibffiというものが必要らしいです。

# 失敗例2
libffiもwgetでインストールしてきます。
```terminal
mkdir -p $HOME/local/libffi/3_2_1
wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
tar xvfz libffi-3.2.1.tar.gz
./configure --prefix=$HOME/local/libffi/3_2_1/
make -j 10
make install 
```
```terminal
mkdir ~/local/include
ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/
ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/

mkdir ~/local/lib
ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/

mkdir ~/local/lib/pkgconfig/
ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig/
```

```terminal
cd $HOME/Python-3.7.16
./configure --prefix=$HOME/local/python/ LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/" --with-system-ffi --enable-optimizations
make -j 10
make altinstall
```
Python自体のインストールはこれで成功しましたが、jupyterをインストールするときに
ModuleNotFoundError: No module named '_sqlite3'
というエラーが出てしまいました。これも先にインストールしておく必要があるようです。

# 成功例
以下のコマンドを全て順番に実行したら上手くいきました。前述のlibffiやsqliteのインストールも含まれています。
```terminal
cd
mkdir -p $HOME/local/libffi/3_2_1/
wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
tar xvfz libffi-3.2.1.tar.gz
cd libffi-3.2.1
./configure --prefix=$HOME/local/libffi/3_2_1/
make -j 10
make install
```
```terminal
cd
mkdir -p $HOME/local/include
ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/
ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/

mkdir -p $HOME/local/lib
ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/

mkdir -p $HOME/local/lib/pkgconfig/
ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig/
```
```terminal
cd
mkdir -p $HOME/local/sqlite
wget http://www.sqlite.org/sqlite-autoconf-3071501.tar.gz
tar xzvf sqlite-autoconf-3071501.tar.gz
cd sqlite-autoconf-3071501
./configure --prefix=$HOME/local/sqlite
make -j 10
make install
```
```terminal
cd
mkdir -p $HOME/local/python
wget http://www.python.org/ftp/python/3.7.16/Python-3.7.16.tgz
tar -zxvf Python-3.7.16.tgz
cd Python-3.7.16
./configure --prefix=$HOME/local/python/ LDFLAGS="-L $HOME/local/lib/ -L $HOME/local/sqlite/lib/" CPPFLAGS="-I $HOME/local/sqlite/include/ -I $HOME/local/include/" --enable-loadable-sqlite-extensions --with-system-ffi --enable-optimizations
make -j 10
make altinstall
```
これでPythonのインストールは完了です。最後にpipをアップグレードしてjupyterをインストールします。
```terminal
cd $HOME/local/python/bin
pip3.7 install --upgrade pip
pip3.7 install jupyter
jupyter notebook
```