GoogleAppEngineではimpが使えないらしい・・・
何をしたかったかって言うと、ひとつのGoogleAppEngineのアカウントで、アプリケーションをいっぱい動かしてみたいなー、そんでそいつらを眺めながら悦に入りたいなーみたいなことをしたかったのですが、それにはソースを分けてそれぞれに処理をハンドリングしてやんないといけないんですよね。
で、最初に考えたのが単純にファイルをimportしてやって、そいつらに対してページを割り当ててやればいいじゃん、ということでした。
これは上手くいきました。
appli1.py
import wsgiref.handlers from google.appengine.ext import webapp class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, I'm appli1!') map = [('/appli1', MainPage)]
appli2.py
import wsgiref.handlers from google.appengine.ext import webapp class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, I'm appli2!') map = [('/appli2', MainPage)]
main.py
import cgi import os import wsgiref.handlers from google.appengine.ext import webapp,db class Main(webapp.RequestHandler): def get(self): self.response.out.write(""" <div><a href="/appli1">appli1</a></div><br> <div><a href="/appli2">appli2</a></div><br> """) import appli1 import appli2 def main(): application = webapp.WSGIApplication( [("/",Main)] + appli1.map + appli2.map , debug=True) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__":
ひとつのアカウントで二つのアプリケーションが作れて使えてはっぴーな気分。
でも、ここまでやって欲がでてきたのが、アプリ作るたびにmain.pyを書き直すのがたるい・・・ということ。どっかのフォルダにソースを放り込んだら自動的にアプリケーション追加、みたいなことになったらいいなぁと、要はプラグインっぽく、ですね。
で、こんなことを試してみたのですが・・
import cgi,os,re,imp import wsgiref.handlers from google.appengine.ext import webapp,db maparr = [] mnamearr = [] dir = os.getcwd() dir = os.path.join(dir,"apps"); for file in os.listdir(dir): m = re.match("^(.+).py$", file) if m : mname = m.group(1) f,n,d = imp.find_module(mname,[dir]) mod = imp.load_module(mname, f, n, d) maparr= maparr + mod.map mnamearr.append(mname) class Main(webapp.RequestHandler): def get(self): for mname in mnamearr: self.response.out.write( "<div><a href=\"/" + mname + "\">" + mname + "</a></div><br>" ) def main(): application = webapp.WSGIApplication( [("/",Main)] + maparr , debug=True) wsgiref.handlers.CGIHandler().run(application) if __name__ == "__main__": main()
appsフォルダに作ったファイルを適当にぶっこんで、あとはimpモジュールが自動的にインポートしてくれますよーみたいなことをしたかったのですが、上手く動きませんでした。残念。
googleappengineのソースを除いてみると、きっちりimpが無効化してあった。
むむむ。