Python 2.7 如何在具有不同文件路径的其他模块中导入或调用python模块/类

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的目录中存

我希望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
的目录中存储的模块,现在,我只加载名为
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!我忘了。关于它的更多信息:请记住接受答案:)