如果不导入 Python 模块,我怎么知道它是否存在?
导入可能不存在的东西(不是我想要的)会导致:
try:
import eggs
except ImportError:
pass
原文由 yarbelk 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果不导入 Python 模块,我怎么知道它是否存在?
导入可能不存在的东西(不是我想要的)会导致:
try:
import eggs
except ImportError:
pass
原文由 yarbelk 发布,翻译遵循 CC BY-SA 4.0 许可协议
ModuleNotFoundError
已在 Python 3.6 中引入,可用于此目的:
try:
import eggs
except ModuleNotFoundError:
# Error handling
pass
当找不到 模块或其父模块之一 时会引发错误。所以
try:
import eggs.sub
except ModuleNotFoundError as err:
# Error handling
print(err)
如果找不到 eggs
模块,将打印一条看起来像 No module named 'eggs'
的消息;但它会打印类似 No module named 'eggs.sub'
如果只有 sub
模块找不到,但 eggs
包可以找到。
有关 ModuleNotFoundError
的更多信息,请参阅 导入系统的文档。
原文由 J.Baoby 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答884 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
长话短说)使用
importlib.util.find_spec(module_name)
(Python 3.4+) 。Python2:
imp.find_module
要检查 导入 是否可以在 Python 2 中找到某些内容,请使用
imp
:要找到带点的导入,您需要做更多的事情:
您还可以使用
pkgutil.find_loader
(与 Python 3 部分大致相同:蟒蛇3
Python 3 ≤ 3.3:
importlib.find_loader
您应该使用
importlib
。我开始这样做:我的期望是,如果你能为它找到一个装载机,那么它就存在。你也可以更聪明一点,比如过滤掉你将接受的装载机。例如:
Python 3 ≥ 3.4:
importlib.util.find_spec
在 Python 3.4
importlib.find_loader
中弃用了 Python 文档,取而代之的是importlib.util.find_spec
。推荐的方法是importlib.util.find_spec
。还有其他像importlib.machinery.FileFinder
,如果您要加载特定文件,这很有用。弄清楚如何使用它们超出了本文的范围。这也适用于相对导入,但你必须提供起始包,所以你也可以这样做:
虽然我确定这样做是有原因的 - 但我不确定它会是什么。
警告
当试图找到一个子模块时,它将导入父模块(对于上述 所有 方法)!
欢迎发表评论来解决这个问题
致谢
find_loader