Python 2.7 如何在具有不同文件路径的其他模块中导入或调用python模块/类
我希望WEB“WSGI pep 3333”API遵循此结构(教育目的):Python 2.7 如何在具有不同文件路径的其他模块中导入或调用python模块/类,python-2.7,exception-handling,Python 2.7,Exception Handling,我希望WEB“WSGI pep 3333”API遵循此结构(教育目的): app.py调用API\u模块,方法如下: app = API_module.api() class Resoure(object): def __init__(self, app): self.app = app def dispatch(self): raise HTTPException() 基于“HTTPGET请求”的api.py将加载名为modules的目录中存
app.py
调用API\u模块
,方法如下:
app = API_module.api()
class Resoure(object):
def __init__(self, app):
self.app = app
def dispatch(self):
raise HTTPException()
基于“HTTPGET请求”的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
包含如下内容:
app = API_module.api()
class Resoure(object):
def __init__(self, app):
self.app = app
def dispatch(self):
raise HTTPException()
到目前为止,我可以动态导入模块,但如果我想从default.py
模块引发异常,我会得到一个:
未定义全局名称“HTTPException”
因此,我想知道如何利用API_模块/异常
,并在所有模块中使用它们
欢迎任何意见、建议和评论 这是一个
sys.path
的问题
在您的设置中,由于您的API_模块
包含在app.py
中,因此您的sys.path
中应该有应用程序的根目录,因此您只需以通常的方式包含API_模块
:
from API_module import exceptions
或
根据你如何使用它
顺便说一句,我建议您使用
pymod=\uuu import\uu('modules.default.default',fromlist=[''])
并将\uu init\uuuuuu.py'文件放在
modules/`根目录中。@Paolo,如果模块在:modules/API/v0/default/default/default.py
emtpy\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuy
将位于每个类似于模块的子目录中,APO/,该怎么办,v0和默认值?是的,这是一种方法。或者您可以使用sys.path
,例如,通过将模块/API/v0
添加到列表中。但是你不能使用modules.default中的。
语法,这对我来说非常优雅。相反,您将使用from default import default
,这从代码读取器的角度来看是不清楚的。我注意到我必须使用\uuu import\uuu('root.api.v0.default.default',fromlist=['')
fromlist实现了这个技巧。没事吧?你说得对@nbari!我忘了。关于它的更多信息:请记住接受答案:)