EmptyPage.jp > Notes > さくらのレンタルサーバで Python 外部モジュールを使う

さくらのレンタルサーバで Python 外部モジュールを使う

公開日: 2005-07-08/更新日: 2012-02-18

お知らせ: 最近の事情に合わせて新しく書き直した「さくらのレンタルサーバに Python モジュールをインストール」のページを用意しました。今後はまずそちらをご参照下さい。(2013年2月8日)

さくらインターネットの「さくらのレンタルサーバ」サービスで Python の外部モジュールを導入・利用するための覚え書きです。

イントロダクション

さくらインターネットのホスティングサービス、「さくらのレンタルサーバ」では、CGI として Python を利用できます。Python には標準モジュールのほかにも、PyPI などで豊富なモジュール、パッケージが公開されています。CGI からこれらを利用することができれば、テンプレート処理やグラフィクス、PDF などを扱う高度な処理を効率的に行うことができます。

「さくらのレンタルサーバ」(スタンダードプラン以上)では、telnet / ssh でホストにログインしての作業が可能なので、いくつかの制限にさえ気をつければ、こうした外部モジュールを自分のホームディレクトリ下にインストールして、CGI から利用できます。

以下は自分なりに知っている範囲内で書きましたが、よりよい解決法がありましたらゲストブックより教えていただけるとありがたいです。その他間違いのご指摘、ご意見・ご感想なども歓迎です。よろしく。

外部モジュールをホームディレクトリ下にインストールする

「さくらのレンタルサーバ」は複数のユーザーでひとつのホストを共有する方式なので、勝手にシステムに独自のモジュールをインストールすることはできません。モジュールを追加するのであれば、自分のホームディレクトリにインストールしなくてはいけません。外部モジュールをシステム標準以外の場所にインストールする方法については、ちゃんとドキュメントがあります。

Python モジュールのインストール
http://www.python.jp/doc/2.7/install/index.html

このドキュメントの「別の場所へのインストール: home スキーム」を読みましょう。これを読むと、--home オプション付きでインストールスクリプトを実行すれば、任意の場所にモジュールを導入できることがわかります。

%python setup.py install --home=~

これで、ホームディレクトリ下、~/lib/python にモジュールがインストールされるわけです。

インストールした外部モジュールをインポートする

シェルから使う

本稿は CGI から外部モジュールを利用する方法についてが主旨で、ホストにログインした状態でシェルから Python スクリプトを実行するといったことは必須の話ではありません。とはいえインストールしたモジュールのテストをしたいということなどもあるので、これについても書いておきます。

--home オプション付きで独自にインストールしたモジュールは、Python インタプリタ自身はそれがどこにインストールされたかを知らないので、そのままではスクリプトから import 文を使ってインポートできるようにはなっていません(カレントディレクトリにある場合は別ですが)。インストールしたモジュールを探索できるよう、Python にそのパスを教えてやる必要があります。

前出のドキュメント「Python モジュールのインストール」の「カスタムのインストール」に書かれているように、Python は sys.path に格納されているパスからモジュールを探すので、これにモジュールのインストールされているパスを追加してやればいいわけですが、「カスタムのインストール」の記事にある方法の中のうち、.pth ファイルを置く方法や site.py を編集する方法は使えません(それをする権限があればそもそもモジュールを自分のホームディレクトリに入れて使ったりする必要はないわけで……)。ここでは環境変数 PYTHONPATH を設定する方法がいいでしょう。ホームディレクトリの .cshrc には各種環境変数を設定している部分があるので、ここに1行追加します。

...
setenv  EDITOR  vi
setenv  PAGER   more
setenv  BLOCKSIZE       K
setenv  PKG_DBDIR       ~/db/pkg
setenv  PYTHONPATH      ~/lib/python
...

対話モードで Python を起動してみて、sys.path の値を確認し、インストールしたモジュールをインポートしてみましょう。

%python
Python 2.4.2 (#2, Nov 14 2005, 12:00:29)
[GCC 2.95.4 20020320 [FreeBSD]] on freebsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/foo/lib/python', '/usr/local/lib/python24.zip', '/usr/local/lib/pyt
hon2.4', '/usr/local/lib/python2.4/plat-freebsd4', '/usr/local/lib/python2.4/lib
-tk', '/usr/local/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-pac
kages']
>>> import spam
>>>

外部モジュールをインポートして、エラーが出なければ問題ありません。

CGI から使う

環境変数 PYTHONPATH を設定していれば通常は外部モジュールもインストールパスを気にすることなくインポートできるはずなのですが、CGI として利用する場合はそれでもうまくいかない可能性があります。

Apache が CGI を実行するときの環境変数は .htaccess ファイルに SetEnv ディレクティブを記述することで設定することができますが、Apache の動作モードによっては、セキュリティ上の対策として、CGI に「安全な」環境変数のみが渡されるようになっていることがあります(Apache の suEXEC 機能といいます)。この場合は CGI に PYTHONPATH を渡すことができません。そしてそういう話をここに書くということは、もちろん「さくらのレンタルサーバ」でもそうなっているわけです。

そうなると、手段はひじょうに限られてきたかに思われます。しかし結局のところ、Python のモジュール探索というのは、 sys.path に入っているパスを順番に見ているに過ぎません。だから、スクリプト内で直接 sys.path にパスを追加してもかまわないのです。スクリプトのどこか先頭付近で、外部モジュールをインポートする前に、sys.path に外部モジュールのインストール先のパスを追加します。

#!/usr/bin/env python

import sys

sys.path.append('/home/foo/lib/python')

import spam
...

これで CGI から外部モジュールを使えるようになりました。

まとめ

以上で述べたことをまとめると次のようになります。

以上、自分の試行錯誤をつたない技量でまとめましたが、だれかのお役に立てれば幸いです。

おまけ:CGI プログラムが動かない……

Python とは直接関係のある話ではないのですが、レンタルサーバで自分の Python プログラムを走らせようとして躓いている人が多いようなのでよくある失敗について書いておくことにしました。

スクリプトの改行コードを確認する

さくらのレンタルサーバの OS は FreeBSD なので、そこで使われている改行コードは LF です。Windows で一般的にテキストファイルを保存すると、その改行コードは CRLF になります。Windows で作ったスクリプトをそのままレンタルサーバにアップロードすると、これが原因となってスクリプトはうまく動きません。

スクリプトの先頭には、インタプリタを指定する #! ではじまる行があります。シェルはこの行を見て、そのスクリプトを実行するインタプリタのコマンドを決定します。

#!/usr/bin/env python

...

Windows で保存したスクリプトでは改行コードが CRLF なので、そうしたファイルでは FreeBSD が先頭の行を読み取ったとき、インタプリタのコマンドが '#!/usr/bin/env python\r' と誤解されてしまいます。そのようなコマンドは存在しないので、スクリプトは実行されません。

プログラミング用のテキストエディタにはほとんどかならず改行コードを選択してファイルを保存する方法が用意されています。CGI プログラムとして実行するファイルは改行コードを LF で保存するようにしましょう。

改訂履歴

2012-02-18
文中のリンク切れになっていた箇所を修正した。かなりのリンク先が参照できなくなっていた。
「おまけ:CGI プログラムが動かない……」を追加。
2012-01-05
#! 行の env コマンドへの引数で PYTHONPATH を指定する方法の記述等を削除した。この方法は FreeBSD 固有のテクニックであったので。
標題からダサかった鍵括弧と「改訂版」の文言を削除。
2008-03-30
user モジュールを使った方法についての記述を削除。その他表現の見直しなどをして改訂版とする。
2005-12-18
さくらのレンタルサーバの Python のバージョンが 2.3.x から 2.4.x になったので、それにあわせて記述を変更。japanese コーデックモジュールなどは不要になったので例からはずした。
2005-07-08
公開。

免責・ライセンス

記述はできるだけ正確なものを心がけてはいますが、作者の知識や調査の不足などから間違ったことが書いてあるかもしれません。この文書の情報にもとづいた行動によって何らかの被害が生じた場合でも、作者はその責任を負いませんので、あしからず。

Copyright (C) 2005-2012 Masaaki Shibata.

クリエイティブ・コモンズ・ライセンス この文書は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。