written: 2013-04-13 .. 2023-01-10
さくらインターネットのレンタルサーバーのサーバーデフォルト Python に対する venv 環境で、pip による matplotlib のインストールを試みたが、そのままでは不可能だったので、メモする。
まず、単に venv でインストールしようとすると、作業用にレンタルサーバーの /var/tmp を使おうとするので、失敗する(参考サイト)。そこで、自分の /home スペース以下の適当な所に tmp ディレクトリを用意して、pip がそこを使ってインストール作業を行うようにする必要がある。
pip は環境変数 TMPDIR を尊重するようなので、TMPDIR に用意したローカルな tmp ディレクトリを設定してから、pip コマンドを実行すればよい。csh 環境では setenv コマンドを使うことになる。
setenv TMPDIR /home/(ユーザー名)/tmp
source venv/bin/activate.csh
pip install matplotlib==3.5.3
deactivate
また、もう一つのハードルがあり、最新の matplotlib では、さくらインターネットのレンタルサーバーのデフォルトの Python(3.8.x)がやや古く、それも原因でインストールに失敗するので、matplotlib 3.5.x にダウングレードしてインストールする必要がある点である。
以上 2 点のハードルをクリアすることで、無事にサーバーデフォルト Python で matplotlib が使えるようになった。
さくらインターネットの最新の FreeBSD サーバーでは、デフォルトで Python 3.8.x が使えるようになっている。さらに、python コマンドも python3 コマンドも、いずれもこの Python 3.8.x(/usr/local/bin/python)へのエイリアスとなっていて、レガシーな Python 2.7.x のことは完全に無視できるようになっている。
さらに、/usr/bin/env が使えるため、/usr/bin/env python や /usr/bin/env python3 でもよい。
一方、macOS の MacPorts 環境でも、port select python python311 で選択したバージョンの Python が /usr/bin/env で使えるようになるので、同様に /usr/bin/env python や /usr/bin/env python3 が使える。
つまり、Python スクリプトのシェバン(#!)記法は #!/usr/bin/env python としておけば、macOS 上でも、さくらインターネットのサーバー上でも、書き換えることなく、共通に使えるようになる。
#!/usr/bin/env python
一方、shell の違いか、macOS(zsh)では、#!python ですら実行可能だったが、さくらインターネットのサーバー(csh)では、無理だった。
また、venv を使う場合は、
#!venv/bin/python
という相対パスで CGI を動かせるが、もちろん、この場合はレンタルサーバー限定である。さらに、注意したいのは、CGI として web からアクセスして動かす場合ではなく、cron で venv 環境の Python プログラムを実行する場合には(サーバー側の cron からの視点で Python プログラム内に記述された全てのパスが判断されるので)、相当パスではだめなので、絶対パスにしなければならないという点である。
さくらインターネットのレンタルサーバーの自分のアカウントにローカルでインストールしていた Python をアップデートしようとしたら、上手くビルドできなかった。それで情報を探していたら、そもそもサーバー OS の FreeBSD のバージョンが 10 年前のもので、これはどうしようもないと思っていたら、今年(2022)、サーバー OS のアップデートができるようになっていたことを忘れていた。
OS のアップデートとは言っても、正確には「新しい OS の載ったサーバーに、自分のアカウントがコピーされて移転する」ことを意味する。
自分の場合は、既存の MySQL のデータベースが旧いままだったのがアップデート要件に引っかかっていたので、さしあたって該当する MySQL のデータベースを v5.7 に移行することで、さくらの管理者メニューからの手動アップデートが可能となった。
アップデートを開始すると、それから 3 時間くらい要したが、無事に終了した。
新 OS のサーバーに移転したので、IP アドレスが変更になる。ムームードメインの DNS で管理している独自ドメインで、さくらのサーバーの IP アドレスを指定している設定があったので、そこは新しい IP に更新した。
新しいサーバーでは、Perl のバージョンが無茶苦茶新しいもの(5.32.x)に跳ね上がっていたが、もう Perl は使わなくなってきているので、正直、今さら Perl のバージョンに気合を入れてもらってもなあ……と思う。
一方で、Python がデフォルトで 3.8.x になっているので、これはかなり嬉しい。
以前はサーバーデフォルトの Python や Perl が古すぎたので、自前で home ディレクトリに最新版の Python や Perl をコンパイルしてインストールしていた。そこが今回の大型アップデートで、ある程度 Python や Perl のバージョンが刷新されたので、必ずしも、自前の Python や Perl を使わなくて済むようになるかもしれない。
ただし、Python にしても Perl にしても、Python は pip で、Perl も cpan で、それぞれライブラリーモジュールを自前で追加しているものがあるので、すぐに自前でインストールした Python や Perl の環境を撤去するのは安全ではない。撤去できるのは、デフォルトの Python や Perl 環境に対して、pip や cpan を使えるようにできてからである。
Python に関しては、venv が使えるようだ(参考1、参考2)。アカウント全体で一つの venv を使うのも一つの手だが、一般的には、Python プロジェクトのフォルダー毎に venv を用意して、その中で必要なライブラリーを pip で拡張して使う。そうすれば、その Python プロジェクトのフォルダーを削除する場合に、それ用に pip でインストールされたライブラリーモジュールもまとめてアンインストールできるからだ。
Perl の方は、最近のことは知らないので venv のようなものはあるのかどうか知らない。perlbrew を使う場合は、バージョン毎に cpan で拡張して使う形だった憶えがある。
該当する Python プロジェクトのフォルダに移動(cd
)し、python -m venv venv
(最後の引数 venv
はサブフォルダ名であり、任意に指定できる)して、venv 用のサブフォルダが用意される。次に、その中に含まれる activate スクリプトを source コマンドによって実行する。自分のさくらインターネットの環境では、csh だったので、activate.csh スクリプトの方を使う必要があった。つまり、source venv/bin/activate.csh
venv を activate した状態で、pip コマンドを実行すると、サーバーデフォルトの Python 環境ではなく、この venv のローカル環境用に拡張ライブラリーを自由にインストールできる。インストール後は、deactivate して出る。
python -m venv venv
source venv/bin/activate.csh
pip install...
deactivate
次に、この venv 環境で実行したい cgi プログラムは、サーバーデフォルトの python コマンドを使わずに、venv 経由で(結局はサーバーデフォルトの python コマンドにリダイレクトされるが)python コマンドを使う必要がある。つまり、相対パスで venv/bin/python
を使うので、#!(シェバン)記法も書き換えておく必要がある。
#!venv/bin/python
こうすることで、pip を自由に使ってローカルに拡張されたライブラリー環境で、サーバーデフォルトの python コマンドを実行できるようになる。
(サーバー OS の大型アップデート以前の古い情報)
さくらのレンタルサーバーの Perl のバージョン管理対策が遅れ気味なのに業を煮やし、毎年のアンケートでも不平を言い続けていました。2013年末、さくらはサーバーのアップデートを実施し、Perl と PHP についてはコントロールパネルでバージョンの選択ができるような仕組にして、最高 5.14 までのバージョンが選択できるようになりました。これは従来の状況からすると、相当画期的なことで、僕は大喜びしました。
それ以降、新しい Perl のバージョンがリリースされたら、選択肢を増やしてくれるのかと思っていたのですが、現時点ではその気配はありません。
そうこうしているうちに、Perl は 5.20 がリリースされ、5.14 は瞬く間のうちに、セキュリティサポートも含めて完全にサポートが打ち切られました……(現状は、5.24 と 5.22 のみがサポート対象)。
また Python については、従来の状態(2.7 のみ)のまま、完全放置状態です。
ということで、さくらインターネット側の対応を待っていたら、思うようにはかどらないことは確かです。結局、自分のディスクスペースに自前の Perl や Python の環境をインストールしてしまうのが手っ取り早い。検索したら、やはり可能なようで、あまり多くはありませんが Python についてはいくつか情報(ある nakagami の日記)が見付かりました。
まあ普通に Python の公式サイトからソースファイルをダウンロードしてきて、make してインストールするという流れになります。
ただし、この作業を行うには、SSH でサーバーに接続して遠隔コンソール画面を通じてコマンド入力による作業を行なう必要があります(参考:さくらのレンタルサーバにSSHでログインしてみた)。
僕が実際にやった作業は下のような感じです:
mkdir ~/local
mkdir ~/local/src
まずは以上のようにして、公式サイトからダウンロードするファイルの置き場として ~/local/src を作成しておきました。以降は Python のインストール作業です:
cd ~/local/src
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
tar -xjf Python-3.6.7.tgz
cd Python-3.6.7
./configure --prefix=$HOME/local/python/ CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib"
make
make install
cd ..
rm -rf Python-3.6.7
rm Python-3.6.7.tgz
インストールする先は ~/local/python を使っています。wget で公式サイトから最新バージョンのソースファイルをダウンロードしています。
ちなみに、configure オプションの CPPFLAGS と LDFLAGS は、pip のエラーに対応するためのものです(参考)。
Perl は Perlbrew という究極兵器があるので、トップページの簡潔な説明に従うだけでした。
~/perl5 以下にインストールされます。
これで、Perl も Python もソースコード内先頭に記述するシェバン記法で絶対アドレスを指定しておけば、CGI スクリプトとして問題なく使えるようになります。
#!/home/(さくらのアカウント名)/perl5/perlbrew/perls/perl-(Perl のバージョン)/bin/perl
#!/home/(さくらのアカウント名)/local/python/bin/python3.3
原則としては上だが、(特に Perlbrew を使っていたりすると)バージョンを更新する度に path が変わってしまい、その都度、該当するすべてのスクリプトのシェバンを修正するのは大変。そこで、~/bin に perl や python のシンボリックリンクを作成しておき、リンク先で各バージョンの path に辿り着くようにしておくとよい。各スクリプトのシェバンではこのシンボリックリンクへの path を使う。そうすれば、バージョン更新時に修正するのは、シンボリックリンクだけで済む。
#!/home/(さくらのアカウント名)/bin/perl
#!/home/(さくらのアカウント名)/bin/python
CPAN の各種の拡張モジュールをインストールするために、cpan コマンドを利用します。
cpan はデフォルトでは、~/.cpan
以下に各種設定ファイルや作業用スペースとして使います。古い cpan 環境をリセットしたければ、この隠しフォルダを次のようにして削除すれば ok です。
rm -rf ~/.cpan
最初に cpan を立ち上げると対話式で色々と質問されますが、基本的にはデフォルトで ok です。
<system>