假设我的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()
因为我希望这个可以直接给用户发消息,但不知道在异常处理的情况下,这是不是一个好主意?
另外,这里至少还有两个问题。
except
该条款将适用于 任何 时发生的错误。import
包括错误不是不存在的情况。foo
. 所以这可能不是一个好的异常处理方法?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
?我是不是傻傻地错过了什么?有什么好的方法来实现这个问题?谢谢你了。
EDIT: 有现有的答案,如 这个 其中讨论了如何在 requirements.txt
并将其安装在 pip
. 然而,我的问题集中在我可以在Python脚本中实现的解决方案上。捕捉缺失的库,并提示用户安装。.
你可以抓住 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的模块之间。所以对于单个库来说,这似乎是正常的,但我没有看到有人大规模检查导入。