【发布时间】:2020-06-02 19:33:19
【问题描述】:
假设我的 Python 3.6 脚本需要库 foo 中的 bar,它以 imports 开头:
from foo import bar
我想做的是让脚本尝试import,如果foo 在他们的系统上不可用并且他们应该安装它,则向下游用户提供反馈。
到目前为止,我已经设法拼凑出这个可能不是很好的解决方案:
try:
from foo import bar
except:
print("Need `foo` library installed")
exit(1)
我使用print() 是因为我希望这可以直接向用户发送消息,但不确定在异常处理的上下文中这是否是个好主意?
另外,这里至少还有两个问题:
-
except子句将适用于在import期间发生的任何 错误,包括错误不是没有foo的情况。所以这可能不是对异常处理的好用? - 我的脚本
imports 多个库,我必须为每个库创建一个类似于上面的块!
我曾短暂考虑过创建一个 for 循环,该循环通过 list 的库依赖项和 import 每个。例如:
list_of_libraries: list = ["foo", "lorem", "ipsum"]
for library in list_of_libraries:
try:
import library
except:
print("Need " + library + " library installed")
exit(1)
但是,这对我来说也很糟糕,因为:
- 每个循环迭代
imports 整个库 - 它会失败,因为我不认为
import需要string? - 它并不能真正解决上述问题 1。
我在这里愚蠢地错过了什么吗?什么是实现这个的好方法?谢谢。
编辑: 现有答案,例如 this one,其中讨论了如何在 requirements.txt 中列出依赖项并使用 pip 安装它们。但是,我的问题集中在我可以在 Python 脚本中实现的解决方案以捕获丢失的库并提示用户安装它们。
【问题讨论】:
-
最简单的解决方案是什么都不做。如果导入失败,将会有一条消息(异常回溯)告诉用户缺少什么。
-
感谢@mkrieger1,但这并不是我所追求的。链接的答案是关于处理
pip和最佳实践,例如使用requirements.txt,但我说的是我可以在我的 Python 脚本中做的事情。
标签: python python-3.x exception dependency-management