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

时间:2013-10-31 14:44:59

标签: python-2.7 exception-handling

我想遵循这个结构的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并在所有动态模块中使用它们。

欢迎任何想法,建议评论。

1 个答案:

答案 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}}个模块/`根目录。