こん○○は、よふかしわーくすのよふかしさんです
先日、レンタルサーバーにPythonを手動インストールする方法、という記事を書いたんですが、進めていくウチにPythonライブラリのpip installがうまくいかない部分が出てきたので、今回は続編として対策を書いてみます
matplotlibがどうしても入らない…FreeBSD環境でconfigure: permission deniedと出て困っているのがまさによふかしさんでした
この記事では、共有レンタルサーバー(FreeBSD)にPython 3.9 + matplotlibをインストールして動かすまでの実録を紹介します
前提条件・環境
今回は以下の環境を前提とした解説になります
バージョンが少しでも変わるとハマるポイントがバシバシ出てくるので、あくまでこの環境下での成功事例の紹介となります
- FreeBSD 11.2-RELEASE-p16(レンタルサーバー環境)
- Bashではなくcshで実行していく
- インストール先:$HOME/local/
- ここに色々入れていく
- 以降はこれから入れていくもの
- OpenSSL 3.4.0
- Python 3.9.18(ソースビルド)
- NumPy 1.24.4(setup.pyベース)
- matplotlib 3.4.3(FreeTypeのビルド回避付き)
特にこんな方には刺さるのではと思います
- FreeBSDのレンタルサーバー環境でPythonを使いたい方
- 描画ライブラリとしてmatplotlib導入しようとしてビルドに失敗して困っている方
色々試してうまくいった安定バージョンでのツールチェーンを選定しています
なので、前回の記事からPython自体もデグレードしています
OpenSSL 3.4.0 の構築
Pythonを入れる前にOpenSSLを入れていきます
これを入れておかないと、pip installコマンドでのインストール作業が実施できないので、まずはここからです
SSH接続の方法は前回の記事を参照してください
下記コマンドを実行します
cd ~/local/src
curl -LO https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar xf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./Configure --prefix=$HOME/local/openssl-3.4.0 --openssldir=$HOME/local/openssl-3.4.0 shared
make -j2
make install
ビルドの成功確認を実施しますが、よふかしさんの環境ではエラーが発生しました
$HOME/local/openssl-3.4.0/bin/openssl version
エラー内容はこうです
Shared object "libssl.so.3" not found, required by "openssl"
対策として下記コマンドを実行してパスを通せばOKです
setenv LD_LIBRARY_PATH "$HOME/local/openssl-3.4.0/lib"
$HOME/local/openssl-3.4.0/bin/openssl version
下記の様な結果が得られたらOKです
OpenSSL 3.4.0 22 Oct 2024 (Library: OpenSSL 3.4.0 22 Oct 2024)
Python 3.9.18 の構築
Python 3.9.18をビルドして環境構築していきます
mkdir -p ~/local/src
cd ~/local/src
curl -O https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz
tar xf Python-3.9.18.tgz
cd Python-3.9.18
./configure --prefix=$HOME/local/python3.9.18 \
--with-openssl=$HOME/local/openssl-3.4.0
make -j2
make install
make -j2の2は実行するコア数の指定でして、ウチの場合は”top”コマンドの実行を眺めた感じ、
CPU7という表示までは見えたので、論理コアが8コアまでありそうでした
なので、~4くらいまで上げてもよさそうですが、案パイで2で実行しました…
インストールできたら一応パスとバージョンの確認をしておきます
~/local/python3.9.18/bin/python3.9 --version
Pythonの仮想環境を構築
元の環境を壊さないためと、再現性の確保のため、Pythonライブラリは仮想環境に構築していきます
“venv-py39” は任意の名前です
~/local/python3.9.18/bin/python3.9 -m venv ~/venv-py39
source ~/venv-py39/bin/activate.csh
表示がこんな感じになったらvenvの構築と接続完了です
(venv-py39) %
NumPy、matplotlibのインストール
実はこれまでに色々ハマって何度かやり直しているのですが、掻い摘んで記載します
まずはpipのアップグレード
pip install --upgrade pip setuptools wheel
NumPyをインストール
pip install numpy==1.24.4
matplotlibをインストール
※ここでもハマります
pip install matplotlib==3.4.3
FreeBSD の共有環境では ./configure を /tmp で実行できないケースがあって
matplotlib の FreeType ビルド時にエラーになります
そこで、TMPDIR 環境変数を使って一時ディレクトリの場所を変更してしまうのが回避策です
mkdir -p ~/tmp_inst
setenv TMPDIR ~/tmp_inst
pip install matplotlib==3.4.3
これで configure: permission denied を回避できます
動作確認
適当なコードを実行して動作確認してみます
python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("Sine Wave - matplotlib 3.4.3 on FreeBSD")
plt.savefig("sine.png")
plt.close()
カレントディレクトリに、sine.pngが作成されていれば成功です
作製ファイルをWindowsにコピー
FreeBSDからログアウトしてファイルをWindwosにコピーしてみます
まずはSSHセッションを抜けます
exit
ログインしてカレントディレクトリにコピーします
SSHログインのアカウント(例:your-username@your-domain.co.jp)を指定してください
scp your-username@your-domain.co.jp:~/venv-py39/requirements.txt .
Windows側のカレントディレクトリは下記で確認できます
Get-Location
このWindowsパスにrequirements.txtがコピーされていれば成功です
参考までに今回の実行結果は下記の内容となってます
cycler==0.12.1
kiwisolver==1.4.7
matplotlib==3.4.3
numpy==1.24.4
pillow==11.2.1
pyparsing==3.2.3
python-dateutil==2.9.0.post0
six==1.17.0
最後にOpenSSLの再確認です
~/local/python3.9.18/bin/python3.9 -c "import ssl; print(ssl.OPENSSL_VERSION)"
今回は下記表示が返ってきたのでOKです
OpenSSL 3.4.0 22 Oct 2024
ごみのお掃除
ストレージ容量確保のため、不要になったDLファイルなどを削除しておきます
# 不要ファイルの削除
rm -rf ~/tmp_inst
rm -f ~/local/src/Python-3.9.18/sine.png
rm -rf ~/.cache/pip
rm -f ~/venv-py39/requirements.txt
sine.pngとrequirements.txtはテスト用に作ったものなので、作成していなければ無視してください
終わりに
FreeBSDのレンタルサーバー環境でのPythonライブラリのインストールは何気に大変でした…
WindowsやLinuxでは事前に整えられているインストール環境ですが
FreeBSDでは自分自身で解決しなければならない領域が非常に多いのが実態です…
Python本体のビルド時にはOpenSSLのバージョン整合性問題がありましたし
matplotlibでは共有サーバー特有のセキュリティ制限により ./configure が実行できなくって、ビルドエラーになることもありました
それ以外にも別バージョンのPythonでのテストでは、ライブラリの依存関係によるエラーのいたちごっこが起きて、ぶっちゃけ数日は悩まされました…
wheelを別のLinux環境で作成して持ってくる、といった方法も案としてはあったのですが
今回はあくまでレンタルサーバー上で、SSH接続だけでどうにかできないか
というコンセプトで試してみて、うまくいった事例の紹介になります
これでやっとやりたかったPythonコードを実行できる様になった、はず。。。
コメント