我想遵循这个结构的WEB“WSGI pep 3333”API(教育目的):
/home/
`--app.py
`--API_module/
`--__init__.py
`--api.py
`--exceptions.py
`--modules/
`--default/
`--__init__.py
`--default.py
app.py
使用以下内容调用API_module
app = API_module.api()
基于“HTTP GET请求”的api.py
将加载存储在名为modules
的目录中的模块,现在,我只是加载一个名为default
的模块。
api.py
看起来像:
import os
import imp
from exceptions import HTTPError, HTTPException
class API(object):
def __call__(self, env, start_response):
self.env = env
self.method = env['REQUEST_METHOD']
try:
body = self.router()
body.dispatch()
except HTTPError, e:
print 'HTTP method not valid %s' % e
except, Exception e:
print 'something went wrong'
start_response(status, headers)
yield body
def router():
module_path = '/home/modules/default/default.py'
if not os.access(module_path, os.R_OK):
raise HTTPException()
else:
py_mod = imp.load_source('default', '/home/modules/default/default.py'
return py_mod.Resource(self)
和default.py
包含以下内容:
class Resoure(object):
def __init__(self, app):
self.app = app
def dispatch(self):
raise HTTPException()
到目前为止,我可以动态导入模块,但如果我想从default.py
模块引发异常,我会得到:
全局名称'HTTPException'未定义
因此我想知道如何利用API_module/exceptions
并在所有动态模块中使用它们。
欢迎任何想法,建议评论。
答案 0 :(得分:2)
这是sys.path
的问题。
在您的设置中,由于API_module
中包含app.py
,因此您应该在sys.path
中拥有应用程序的根目录,因此您应该在API_module
中加入from API_module import exceptions
通常的方式:
from API_module.exceptions import *
或
pymod = __import__('modules.default.default', fromlist=[''])
根据您的使用方式而定。
顺便说一句,我建议您使用__init__.py' file in the
并放置{{1}}个模块/`根目录。