Tuesday, July 29, 2008

利用python, 构建自己的URLModuleLoader

利用python, 构建自己的URLModuleLoader.
需求:
为了便于客户端的代码更新, 故将module放到了服务器上, 客户端只需要一个简单的run.py, 剩下的问题用URLModuleLoader来搞定!
资源: http://localhost:8080/modules下放置了很多python modules, 举例来说logger.py, etc...

from ihooks import ModuleLoader, ModuleImporter
from urllib2 import urlopen, HTTPError
from urlparse import urljoin
import tempfile
import os

url_path=['http://localhost:8080/modules']

"""URL loader 的实现"""
class URLModuleLoader(ModuleLoader):
def find_module(self, name, path=None):
stub=ModuleLoader.find_module(self, name, path)
if stub:
#print "module :", name, stub
return stub
if path:
return
 """本地module优先, 如果本地没有, 则到服务器上去取"""
for base in url_path:
url=urljoin(base, name+'.py')
try:
file = urlopen(url)
name=tempfile.mktemp()
stream=open(name, 'wb')
stream.write(file.read())
stream.close()
file.close()

file=open(name, 'r')
#print "module :", url
return file, url, ('.py', 'r', 1)
except HTTPError, e:
#print e
return None

"""实现importer"""
class URLImporter(ModuleImporter):
def __init__(self):
hooks, verbose=(None, 1)
loader=URLModuleLoader(hooks, verbose)
ModuleImporter.__init__(self, loader, verbose)


"""设置自己的module loader"""
URLImporter().install()

"""测试"""
if __name__=="__main__":
import logger
import re
import base64
logger.log("logger loaded from remote packages")
logger.log("logger infomation demo")

No comments: