继续:如何在不导入的情况下检查 python 模块是否存在
该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 及更高版本