在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')]
但是因为我提出错误,构建过程停止了 - 我只想默默地忽略导入...返回"无"也行不通。 有没有办法做到这一点?
答案 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