导入时丢失模块的友情错误消息

paf*_*fcu 5 python exception-handling

如果用户试图运行试图导入尚未安装的模块的python脚本,我想实现一些更友好的错误消息.这包括打印有关如何安装缺失模块的说明.

一种方法是在输入周围放一个try..catch块,但这有点难看,因为它会变得简单像

import some_module
Run Code Online (Sandbox Code Playgroud)

try:
  import some_module
except ImportError, e:
  handle_error(e)
Run Code Online (Sandbox Code Playgroud)

它必须添加到每个文件中.另外,ImportError似乎没有将丢失模块的名称存储在任何地方(消息中除外),因此如果您需要知道名称(如我所知),则必须在每次导入时放置一个单独的try..catch .解析模块的名称不是选项,因为ImportError携带的消息可能会因python版本更改为版本而取决于用户的语言环境.

我想我可以使用sys.excepthook来捕获所有异常并传递除了ImportError之外的那些异常.或者可以定义类似的东西

safe_import some_module
Run Code Online (Sandbox Code Playgroud)

那会表现得像我想要的那样?

有谁知道这个问题的任何现有解决方案?

Ale*_*lli 6

您可以放置​​,它将始终执行(例如在site.py或sitecustomize.py中):

import __builtin__

realimport = __builtin__.__import__

def myimport(modname, *a):
  try:
    return realimport(modname, *a)
  except ImportError, e:
    print "Oops, couldn't import %s (%s)" % (modname, e)
    print "Here: add nice directions and whatever else"
    raise

__builtin__.__import__ = myimport
Run Code Online (Sandbox Code Playgroud)

请参阅此处__import__文档.


Mar*_*wis 2

我会将其他模块放入包中,导入时打印出更有用的消息,然后引发常规的 ImportError。当安装了真正的模块时,您的模块将被隐藏(确保您将它们所在的目录添加到sys.path 的末尾)。