XserverにPython3.10.6をインストールしてみる

XserverにSSH接続して、VSCodeでプログラミングもどきをしているのですが、デバッグができないことに気づきながらも渋々コード書いていました。
どうしてもバグの原因が分からず、デバッグしたい衝動にかられ、でも出来ない。
なんで〜といろいろ調べていたらdebugpyはPythonが3.7以降じゃないとサポートしていないんだとか。
Xserverに元々入っているPythonは3.6.8なのでそれじゃ動かないわなというわけで、当時最新版だった3.10.6をインストールしてみました。

xserverはブログ向けのレンタルサーバーで契約しているので、root権限が与えられていません。
ですが、makeは使えるので、コンパイルして自分用のディレクトリ下にはインストールすることはできます。
そのままの状態でPythonをmake、make installしても動くには動くのですが、requestsが使えなかったりするので、今回はctypesとopensslを入れてからPython3.10.6を入れてみます。
よくminicondaかmicorocondaをインストールしている記事がありますが、作業量はこの方法の方が多いかもしれませんが、環境はシンプルだと思います。

libffiをインストールする。

検索するとどうやら_ctypesにはffiなるものが必要らしいです。
先駆者の力を借ります。

libffiを頂戴します。

wget https://github.com/libffi/libffi/releases/download/v3.4.2/libffi-3.4.2.tar.gz
tar xvfz libffi-3.4.2.tar.gz

今回はこの方に倣ったパス(/home/xsXXXXXX/local)でインストールを試みます。

cd libffi-3.4.2
./configure --prefix=$HOME/local/libffi/3_4_2
make
make install

またもや同じようにディレクトリとシンボリックリンクを作成します。

cd ~/local/
mkdir -p include
mkdir -p lib/pkgconfig
mkdir -p lib64

ln -s ~/local/libffi/3_4_2/include/ffi.h ~/local/include/
ln -s ~/local/libffi/3_4_2/include/ffitarget.h ~/local/include/
ln -s ~/local/libffi/3_4_2/lib/pkgconfig/libffi.pc ~/local/lib/pkgconfig
ln -s ~/local/libffi/3_4_2/lib64/libffi.a ~/local/lib64/
ln -s ~/local/libffi/3_4_2/lib64/libffi.la ~/local/lib64/
ln -s ~/local/libffi/3_4_2/lib64/libffi.so ~/local/lib64/
ln -s ~/local/libffi/3_4_2/lib64/libffi.so.8 ~/local/lib64/
ln -s ~/local/libffi/3_4_2/lib64/libffi.so.8.10 ~/local/lib64/

今回はBashを使用しているので、bash_profileに追記します。

# ffi settings
export LD_LIBRARY_PATH=$HOME/local/lib64
export PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig

open sslをインストールする。

次にopensslをインストールします。
先駆者の知恵をありがたく拝借します。

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar -zxf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
./config --prefix=$HOME/local/openssl
./config --openssldir=$HOME/local/openssl
# 最初はprefixでやっていましたが、右往左往してopenssldirをいじったもので最後まで行きついたので、こっちが正しいのかもしれません。
make
make install

とりあえずバイナリはリンクを作っておきます。

ln -s ~/local/openssl/bin/openssl ~/local/bin

bash_profileに追記します。
opensslは~/local/binにリンクを張っておきましたが、c_rehashなるものも作成されていたので、PATHを通しておきます。

# openssl settings
export PATH=$HOME/local/openssl/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/openssl/lib:$LD_LIBRARY_PATH

Pythonをインストールする。

ffiとopensslをインストールできたので、いよいよPythonをインストールします。

# bash_profileを再読み込み
source /.bash_profile
wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz
tar -zxf Python-3.10.6.tgz
cd Python-3.10.6
./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib64/" CPPFLAGS="-I $HOME/local/include/" --with-openssl=$HOME/local/openssl/ --with-openssl-rpath=auto
make
make install
INFO: Can't locate Tcl/Tk libs and/or headers

The necessary bits to build these optional modules were not found:
_bz2                  _curses               _curses_panel      
_sqlite3              _tkinter              _uuid              
readline                                                       
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  pwd                   time               

running build_scripts

今回は大丈夫なようです。
tkinterが使えないようですが、CUIなので関係ないと判断。
_sqlite3 _uuidが使えない?のは後々flask等を使用したときに響いてくるかも・・・

venvで環境をつくる。

moduleをpipで積む時のために仮想環境を作っておきます。

$ local/python/bin/python3 -m venv myenv-3.10.6
$ source myenv-3.10.6/bin/activate
(myenv-3.10.6) $ pip3 install numpy
Collecting numpy
Downloading numpy-1.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.0/17.0 MB 96.1 MB/s eta 0:00:00
Installing collected packages: numpy
Successfully installed numpy-1.23.2

numpyもインストールできたし、デバッグもできました。

メモ。

デバッグ時に
ImportError: libffi.so.8: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
こんなエラーが出ましたが、bash_profileを再読み込みしたら治りました。

コメントする