外部モジュールが読み込めない件(その4)少し理解してきたかも
今日から本格的に自宅のMacで作業しはじめたのだが、上記の手順で作ったプロジェクトのmain.pyに、軽い気持ちでimport BeautifulSoup と書いて実行させたら、またぞろエラーになったので、GAEのドキュメントを読んでいたら、その件についてちゃんと書いてあった。
http://code.google.com/intl/ja/appengine/docs/python/runtime.html#Pure_Pythonより引用:
Python モジュールのインクルード パスにはアプリケーションのルート ディレクトリ(app.yaml ファイルを含むディレクトリ)が含まれます。アプリケーションのルート ディレクトリに作成するモジュールはルートからのパスを使用することで使用可能になります。Python がサブ ディレクトリをパッケージと認識できるように、忘れずに __init__.py ファイルをサブ ディレクトリに作成してください。
ということは、こういうことか。
- プロジェクトのルートディレクトリ配下に、たとえば「lib」という名前のフォルダを作成する。
- そこに、BeautifulSoup.py とかを置く。
- そこに、__init__.py というファイルを作って置く。中身はからっぽでOK
ここまでやったら、ソースコード上にこう書く。
import lib.BeautifulSoup または from lib import BeautifulSoup
んで実行したら・・・動いた。
参考:http://atkonn.blogspot.com/2008/02/python-python38.html
ドキュメント読んでて思ったのだが、コンソール(コマンドプロンプト)で対話形式のpython動かして、そこで import BeautifulSoup ってやってもエラーにならないのは、PYTHONPATHによってサーチパスが切られている場所(site-packagesとか)にBeautifulSoup.pyが置かれているからだけど、GAE上で動いているPythonアプリケーションは、そこを見に行く訳じゃないっていうことなんだろうか。
ドキュメントによれば、GAEのPython環境には、ピュアPythonの他に、サードパーティのライブラリとして、Django, WebOb, PyYAMLが含まれている、と書いてあるが、逆に言うと、それ以外のサードパーティーライブラリは含まれていない(含ませることはできない)ということだから、本番環境の.../Python/lib/site-packagesにBeautifulSoup.pyを置く、みたいなことはできないわけで、そうである以上、アプリケーションディレクトリ配下に置いて、それをパッケージとして認識させなきゃいけない、ということなのだろう。
今まで、出来ない出来ないと言っていたのは、すべて、GAE上で動かすアプリケーションだった。普通のPythonプロジェクトであれば問題はなかったのだから、python と、google app engine がごちゃごちゃになっていたためにハマってしまったということだ。
2009/11/10 追記
上記と同じ事を、Windows環境でもやってみたのだが・・・importできなかった。
なんだかもうよくわからない。
Windows環境では、GoogleAppEngineLauncherを使っていないなどの違いもあり、原因が絞り込めないので、その3で試した方法に戻すことにした。
2009/12/02 追記
その後、いろいろ試すうちに、問題なくImportできる方法が確立したと思えるので、こちらにまとめた。
結論をひとことで言うと「GoogleAppEngineLauncherを使って新規プロジェクトを追加するほうがいい」。
2014/9/24 追記
なんと5年越しにこの問題に決着がついた。やっと理解。上にいろいろ書いてきたことは結構的外れだった。
http://d.hatena.ne.jp/noazoh/20140924/1411553513