さくらインターネットのレンタルサーバのOS(FreeBSD)が13.0にバージョンアップされた。これに伴いようやくPythonも、Version2.7から3.8.12が標準ライブラリとして提供されるようになった。しかし先に自分でインストールしたPython3.6.5のRequestモジュールは、OpenSSLのRevsionとインストールDirectoryの変更により、SSLErrorとなってしまった。そこで、改めてPython3.8.12の環境をローカル領域にビルドした。
前回と同様の手順でビルドできると思ったが、OSの大きな変更のため、今回はうまくインストールできない。
とりあえず以下の手順でシステムのPython3.8と~/LocalのPython3.8、3.6を共存させて動作できるようにしたが、安定的に動作するか不安。いったんインストールの顛末を記しておく。
<インストール手順>
■Pythonのアーカイブファイルをダウンロード
・テンポラリ作業ディレクトリworkspaceにPython3.8.12のアーカイブ圧縮ファイルをダウンロードし展開する
% mkdir -p ~/workspace/
% cd ~/workspace/
% wget –no-check-certificate https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
% tar -zxvf ./Python-3.8.12.tgz
Pythonのアーカイブファイルはこちらを参照
https://www.python.org/ftp/python/
■ユーザエリア($HOME/local/python)にPython3.8.12をインストール
作業ディレクトリに展開されたPython-3.8.12ディレクトリに入り、.configure —> make —> make installの順で、$HOME/local/pythonにpython3.8.12の本体…bin, lib, inculde, shareをインストールする。
①% cd ./Python-3.8.12
②.configure命令でmake fileを作成する。
FreeBSD Ver13のOpenSSLのIncudeDirectoryは「/usr/local/include/openssl」であり、また各種Libraryは「usr/local/lib」の下にあるので、以下のオプションをつけてコンパイル。
% ./configure CPPFLAGS="-I/usr/local/include/openssl" LDFLAGS="-L/usr/local/lib" --prefix=$HOME/local/python --with-system-ffi --with-ensurepip
–with-system-ffi:
システムにインストールされている libffi をリンクすることを指示
–with-ensurepip:
pip コマンドと setuptools をビルドすることを指示
③ %make
④ %make install
⑤ .cshrcに以下を追加し再読み込み
### 以下を追加 2022-09-01 for python3.8
set path = ($path $HOME/local/python/bin/python3.8)
set path = ($path $HOME/.local/lib/python3.8/site-packages)
% source ~/.cshrc
% rehash
ここでpipがインストールされているか確認すると、user領域のサイトパッケージ内にpip20.2.3がインストールされていたので、22.2.2にVersionをUpdate
% /home/miyasan/local/python/bin/python3.8 -m pip --version
pip 22.2.2 from /home/miyasan/local/python/lib/python3.8/site-packages/pip (python 3.8)
しかし、pip3.8と入力しても反応せず、pip3.6がPython3.8のpipコマンドになっていた。これはPython3.6が存在している影響なのか不明。
% pip3.8 --version
Traceback (most recent call last):
File "/home/miyasan/.local/bin/pip3.8", line 5, in <module>
from pkg_resources import load_entry_point
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 2976, in <module>
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 2962, in _call_aside
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 2989, in _initialize_master_working_set
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 662, in _build_master
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 675, in _build_from_requirements
File "build/bdist.freebsd-9.1-RELEASE-p24-amd64/egg/pkg_resources/__init__.py", line 854, in resolve
pkg_resources.DistributionNotFound: The 'pip==20.0.2' distribution was not found and is required by the application
%
% pip3.6 --version
pip 22.2.2 from /home/miyasan/local/python/lib/python3.8/site-packages/pip (python 3.8)
■Pythonモジュール numpy, pandas,matplotlibのインストール
とりあえずこの状態で、データ分析に必須の上記モジュールをインストール。
wheel –> numpy –> matplotlib –> pandasの順にユーザーサイトパッケージ内にインストールするが、最新パッケージがインストールできない。仕方なく、Python3.6.5と同じバージョンをインストールすることにしたが、numpy以外はVersionをさらに落とさないとインストールできなかった。(原因不明)
最終的なpip3.6 install リスト
% pip3.6 install <module name> --user
Package Version
------------------ -----------
asttokens 2.0.8
backcall 0.2.0
beautifulsoup4 4.11.1
bs4 0.0.1
certifi 2022.6.15
charset-normalizer 2.1.1
cycler 0.11.0
decorator 5.1.1
et-xmlfile 1.1.0
executing 1.0.0
idna 3.3
ipython 8.4.0
jedi 0.18.1
matplotlib 2.0.0
matplotlib-inline 0.1.6
numpy 1.18.4
openpyxl 3.0.10
pandas 0.23.4
parso 0.8.3
pexpect 4.8.0
pickleshare 0.7.5
pip 22.2.2
prompt-toolkit 3.0.30
ptyprocess 0.7.0
pure-eval 0.2.2
Pygments 2.13.0
pyparsing 3.0.9
python-dateutil 2.8.2
pytz 2022.2.1
requests 2.28.1
setuptools 56.0.0
six 1.16.0
soupsieve 2.3.2.post1
stack-data 0.5.0
traitlets 5.3.0
urllib3 1.26.12
wcwidth 0.2.5
wheel 0.37.1
■Pandasがインポートできない原因と対策
続いてPythonを走らせて、installしたモジュールをインポートすると、なんとpandasがインポートできない。
>>>import pandas
・・・・・
ImportError: /usr/local/lib/compat/libstdc++.so.6: version GLIBCXX_3.4.21 required by /home/miyasan/.local/lib/python3.8/site-packages/ not found
これは OSにインストールされているlibstdc++.so.6ライブラリが古く、ソフトウェアが要求するバージョンと合わないようだ。下記のコマンドでバージョンを調べると、GLIBCXX_3.4.9までしか対応していない。
% strings /usr/local/lib/compat/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_FORCE_NEW
libstdc++.so.6はGCCのランタイムライブラリで、さくらサーバーの/usr/local/lib/gcc9ディレクトリにあるようだ。このライブラリのバージョンを調べてみると、GLIBCXX_3.4.28まで対応している。
% strings /usr/local/lib/gcc9/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
・・・
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
そこでlibstdc++.so.6: version GLIBCXX_3.4.21が適用されるように、半信半疑で.cshrcにLD_LIBRARY_PATHを設定してみると、問題なくpandasをimpotすることができた。
setenv LD_LIBRARY_PATH /usr/local/lib/gcc9
% python ・・・サーバーOSのPythonの呼び出し
Python 3.8.12 (default, Jan 13 2022, 04:23:19)
[Clang 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c on freebsd13
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>> import pandas
>>>
% /home/miyasan/local/python/bin/python3.8 ・・・ユーザ領域にビルドしたPythonの読み出し
Python 3.8.12 (default, Sep 1 2022, 22:02:25)
[GCC 9.4.0] on freebsd13
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>> import pandas
>>>
■CRONタブ設定
ユーザがrootでも、LD_LIBRARY_PATHが/usr/local/lib/gcc9となるように、さくらインターネットのコントロールパネルで環境変数を指定
以上の設定で、何とかこれまでのサーバー環境を維持して、気象データの自動取得や計算ができるようになった。ただし、Pythonが複数バージョン稼働している環境ではインストールミスが起きやすいので、今後、恒久対策の検討が必要である。
コメント