Python:在缺少依赖项时动态引发导入时的异常

时间:2015-05-22 13:26:10

标签: python import

我有一个包含这样结构的包:

foo/
  __init__.py
  bar1.py
  bar2.py

bar1bar2Bar1Bar2个班级。我已将__init__.py导入到类中以便允许

from foo import Bar1

而不是写

from foo.bar1 import Bar1

好的,这个工作正常,现在是棘手的部分。

bar1bar2在导入时会引发异常MissingDependency,但缺少某些依赖项

所以我的__init__.py就像这样实现了

try:
    from .bar1 import Bar1
except MissingDependency:
    pass

try:
    from .bar2 import Bar2
except MissingDependency:
    pass

这意味着foo的导入有效但不导入Bar1Bar2

import foo

现在,我想要做的是在您尝试导入Bar1时引发MissingDependency,但它失败了。

目前发生的事情是

from foo import Bar1
... 
ImportError: cannot import name Bar1

我希望它引发MissingDependency

from foo import Bar1
... 
MissingDependency: "Cannot import Bar1"

编辑:我用包名

更正了一些错误

3 个答案:

答案 0 :(得分:1)

对于感兴趣的人,我找到了实施PEP0302

的解决方案

基本上我写了一个finder和loader类,并将它添加到sys.meta_path

import sys
import imp  

class MyLoader(object):
    def find_module(self, name, path=None):
        try:
            return imp.find_module(name, path)
        except ImportError as ie:
            if name == 'foo.Bar1':
                raise MissingDependency()
            raise ie

    def load_module(self, name):
        return imp.load_module(name)

try:
    from .bar1 import Bar1
except:
    pass

try:
    from .bar2 import Bar2
except:
    pass

sys.meta_path = [MyLoader()]

答案 1 :(得分:0)

我不是百分之百确定你为什么会这样,但你可以提出一个不同的例外:

try:
    from package import Mod1
except ImportError:
    raise MissingDependency("Cannot import Mod1")

答案 2 :(得分:0)

它可能不是您要找的......但您想要更改处理导入的默认机制。

try:
  from package import Mod1
except ImportError:
  raise MissingDependency