接下来来自:How to check if a python module exists without importing it
imp.find_module 函数将返回一个 3 元素元组(文件、路径名、描述)或引发 ImportError。
如果模块有问题,它不会引发错误,只有当它不存在时。
python 文档建议您首先找到并导入包,然后在第二个find_module 中使用它的路径,必要时递归执行此操作。
这对我来说似乎有点混乱。
下面的函数将检查给定模块是否存在,在任何相对导入级别(module.py、package.module.py、package.subpackage.module.py 等)。
imp.find_module 返回一个打开的文件,您可以在imp.load_module 中使用该文件,但这似乎也有点笨拙,所以我关闭了该文件,以便可以将其导入函数之外。
请注意,这并不完美。如果您正在寻找 package.subpackage.module 但实际上 package.subpackage 是一个有效模块,它也会返回 true。
import imp
import importlib
def module_exists(modulename):
modlist = modulename.split('.')
pathlist = None
for mod in modlist:
print mod
try:
openfile, pathname, desc = imp.find_module(mod,pathlist)
pathlist = [pathname]
except ImportError:
print "Module '{}' does not exist".format(mod)
return(False)
else:
print 'found {}'.format(openfile)
if openfile:
openfile.close()
return(True)
if __name__ == '__main__':
mymodule = 'parrot.type.norwegian_blue'
if module_exists(mymodule):
importlib.import_module(mymodule)
另请注意,我使用的是importlib.import_module 而不是__import__。
最后,请注意importlib 是 Python 2.7 及更高版本