EmptyPage.jp > Notes > さくらのレンタルサーバで Python 外部モジュールを使う
公開日: 2005-07-08/更新日: 2012-02-18
お知らせ: 最近の事情に合わせて新しく書き直した「さくらのレンタルサーバに Python モジュールをインストール」のページを用意しました。今後はまずそちらをご参照下さい。(2013年2月8日)
さくらインターネットの「さくらのレンタルサーバ」サービスで Python の外部モジュールを導入・利用するための覚え書きです。
さくらインターネットのホスティングサービス、「さくらのレンタルサーバ」では、CGI として Python を利用できます。Python には標準モジュールのほかにも、PyPI などで豊富なモジュール、パッケージが公開されています。CGI からこれらを利用することができれば、テンプレート処理やグラフィクス、PDF などを扱う高度な処理を効率的に行うことができます。
「さくらのレンタルサーバ」(スタンダードプラン以上)では、telnet / ssh でホストにログインしての作業が可能なので、いくつかの制限にさえ気をつければ、こうした外部モジュールを自分のホームディレクトリ下にインストールして、CGI から利用できます。
以下は自分なりに知っている範囲内で書きましたが、よりよい解決法がありましたらゲストブックより教えていただけるとありがたいです。その他間違いのご指摘、ご意見・ご感想なども歓迎です。よろしく。
「さくらのレンタルサーバ」は複数のユーザーでひとつのホストを共有する方式なので、勝手にシステムに独自のモジュールをインストールすることはできません。モジュールを追加するのであれば、自分のホームディレクトリにインストールしなくてはいけません。外部モジュールをシステム標準以外の場所にインストールする方法については、ちゃんとドキュメントがあります。
このドキュメントの「別の場所へのインストール: 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 >>>
外部モジュールをインポートして、エラーが出なければ問題ありません。
環境変数 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 から外部モジュールを使えるようになりました。
以上で述べたことをまとめると次のようになります。
「さくらのレンタルサーバ」では外部モジュールをシステム標準の場所にはインストールできない。そこでセットアップスクリプトの --home オプションを使う。
インストールした外部モジュールをインポートできるように、環境変数 PYTHONPATH を設定する。しかしこれはホストにログインした環境でしか使えない。
CGI では、.htaccess に SetEnv ディレクティブを記述することで環境変数をセットできるのだが、「さくらのレンタルサーバ」のようにこれができない場合もある。
そういうときはスクリプト内で sys.path に外部モジュールのパスを直接追加すればよい。
以上、自分の試行錯誤をつたない技量でまとめましたが、だれかのお役に立てれば幸いです。
Python とは直接関係のある話ではないのですが、レンタルサーバで自分の Python プログラムを走らせようとして躓いている人が多いようなのでよくある失敗について書いておくことにしました。
さくらのレンタルサーバの OS は FreeBSD なので、そこで使われている改行コードは LF です。Windows で一般的にテキストファイルを保存すると、その改行コードは CRLF になります。Windows で作ったスクリプトをそのままレンタルサーバにアップロードすると、これが原因となってスクリプトはうまく動きません。
スクリプトの先頭には、インタプリタを指定する #! ではじまる行があります。シェルはこの行を見て、そのスクリプトを実行するインタプリタのコマンドを決定します。
#!/usr/bin/env python ...
Windows で保存したスクリプトでは改行コードが CRLF なので、そうしたファイルでは FreeBSD が先頭の行を読み取ったとき、インタプリタのコマンドが '#!/usr/bin/env python\r'
と誤解されてしまいます。そのようなコマンドは存在しないので、スクリプトは実行されません。
プログラミング用のテキストエディタにはほとんどかならず改行コードを選択してファイルを保存する方法が用意されています。CGI プログラムとして実行するファイルは改行コードを LF で保存するようにしましょう。
記述はできるだけ正確なものを心がけてはいますが、作者の知識や調査の不足などから間違ったことが書いてあるかもしれません。この文書の情報にもとづいた行動によって何らかの被害が生じた場合でも、作者はその責任を負いませんので、あしからず。
Copyright (C) 2005-2012 Masaaki Shibata.
この文書は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。
このサイトについてのお問い合わせはゲストブックよりお寄せください。