如何在导入期间忽略python模块?

时间:2017-06-08 21:08:16

标签: python module

在Python应用程序的构建过程中,我需要忽略一些导入(因为这些模块是由构建过程创建的)。这是一个鸡蛋问题,我无法轻易解决。 所以我想我可以使用import hook来做到这一点:

class ImportBlocker(object):
    def __init__(self, *args):
        self.module_names = args

    def find_module(self, fullname, path=None):
        if fullname in self.module_names:
            return self
        return None

    def load_module(self, name):
        raise ImportError("%s is blocked and cannot be imported" % name)

import sys
sys.meta_path = [ImportBlocker('chickenlib')]

但是因为我提出错误,构建过程停止了 - 我只想默默地忽略导入...返回"无"也行不通。 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

如果您正在使用Python 3.4或更高版本,则可以通过稍微更改您的示例来“默默地忽略”导入,以实现将创建模块的exec_module。< / p>

class ImportBlocker(object):
    def __init__(self, *args):
        self.module_names = args

    def find_module(self, fullname, path=None):
        if fullname in self.module_names:
            return self
        return None

    def exec_module(self, mdl):
        # return an empty namespace
        return {}

现在:

>>> import sys
>>> sys.meta_path = [ImportBlocker('chickenlib')]

>>> # this will work fine
>>> import chickenlib

>>> # there is nothing useful in your imported module
>>> print(vars(chickenlib))
{'__doc__': None, '__package__': '', '__name__': 'chickenlib', '__loader__': <__main__.ImportBlocker object at 0x102b8c470>, '__spec__': ModuleSpec(name='chickenlib', loader=<__main__.ImportBlocker object at 0x102b8c470>)}

答案 1 :(得分:0)

参考&#34;默默地忽略导入&#34;,你可以试试这个:

def TryImport(module_name):
    try:
        import module_name
    except:
        pass #or anything to log