Python - 用户友好的检查缺失库依赖关系的最佳实践?

问题描述 投票:0回答:1

假设我的Python 3.6脚本需要用到 bar 在图书馆 foo,它 import的开头。

from foo import bar

我想做的是让剧本尝试... import的情况下,向下游用户反馈。foo 在他们的系统上是不可用的,他们应该安装它。

到目前为止,我已经成功地破解了这个解决方案,这可能不是很好。

try:
    from foo import bar
except:
    print("Need `foo` library installed")
    exit(1)

我用了 print() 因为我希望这个可以直接给用户发消息,但不知道在异常处理的情况下,这是不是一个好主意?

另外,这里至少还有两个问题。

  1. 这个... except 该条款将适用于 任何 时发生的错误。import 包括错误不是不存在的情况。foo. 所以这可能不是一个好的异常处理方法?
  2. 我的脚本 import的多个库,而我必须为每个库创建一个像上面这样的块。

我简单地考虑过为每个库创建一个 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)

然而,这在我看来也很糟糕,因为:

  • 每次循环迭代 import的整个图书馆
  • 它会失败,因为我不认为 import 需要 string?
  • 这并不能真正解决上面的问题1。

我是不是傻傻地错过了什么?有什么好的方法来实现这个问题?谢谢你了。

EDIT: 有现有的答案,如 这个 其中讨论了如何在 requirements.txt 并将其安装在 pip. 然而,我的问题集中在我可以在Python脚本中实现的解决方案上。捕捉缺失的库,并提示用户安装。.

python python-3.x exception dependency-management
1个回答
1
投票

异常条款

你可以抓住 ModuleNotFoundError (在Python 3.6中存在) 或 ImportError (适用于所有Python版本)来限制你的 except 子句来解决进口麻烦的情况。ModuleNotFoundError 的一个子类。ImportError,所以赶上 ImportError 将在所有版本的Python中工作。

错误输出

在标准的linux应用程序中,错误会被写入stderr而不是stdout。所以与其使用普通的 print你可以按以下方式操作。

import sys

try:
    from foo import bar
except ImportError:
    print("Need `foo` library installed", file=sys.stderr)
    exit(1)

你可以通过将stdout重定向到... /dev/null. 你仍然会看到错误信息。

$ python foobar.py >> /dev/null
Need `foo` library installed

更好的处理可能吗?

至于有什么比单独编写每个导入或循环处理所需的库更好的方法,很遗憾我不知道。我已经看到了 try except ImportError 模样 搭配 从Python 2重命名到Python 3的模块之间。所以对于单个库来说,这似乎是正常的,但我没有看到有人大规模检查导入。

© www.soinside.com 2019 - 2024. All rights reserved.