我想在已发布的软件包中导入模块,只有在已安装的模块中,并且正在寻找正确的方法。
关于可选模块的几个现有问题被欺骗并指向此处。
What's Python good practice for importing and offering optional features?
但他们都依靠try except ImportError:
块来工作。
最近关于检查模块存在的更好方法(特定于python版本)的讨论在这里:How to check if a python module exists without importing it它提供了很好的方法来检查,但它们涉及到ImportError掩码模块问题的危险,而不是实际的非-存在。一般性讨论似乎围绕一个版本或另一个版本的独立代码,而不是针对任何版本和分发的包。
所以,如果我把这两个讨论结合起来,我就明白了:
def module_exists(module_name):
import sys
import pkgutil
import importlib
if sys.version_info < (3,0):
return pkgutil.find_loader(module_name) is not None
elif sys.version_info >= (3,0) and sys.version_info <= (3,3):
return importlib.find_loader(module_name) is not None
elif sys.version_info > (3,3):
return importlib.util.find_spec(module_name) is not None
return False
我担心这似乎很脆弱。或者至少就像我重新发明轮子一样。
我应该继续使用try except ImportError
的旧答案吗?因为,与第二个引用的ImportError问题不同,如果导入时出错,我仍然无法实际使用当前模块。或者,礼貌的事情是尝试使用它并因为当前模块的问题而崩溃,而不是假装它不存在(ImportError
)它是什么时候?
我的用例只是为了在广泛分发的软件包的一个本地化配置文件下存在某个模块时提供增强功能。我不想让其他本地化的任何用户都需要一个根本无法帮助他们的模块。即使没有第三方模块,正常功能也会继续。
答案 0 :(得分:0)
使用
try:
import somemodule
except ImportError:
# handle module not being available
ImportError
是否掩盖了模块的问题并不重要 - 你只关心它是否可导入,所以导入它是最好的测试。