如果从源目录导入,则捕获python'ImportError'

时间:2013-02-07 12:05:43

标签: python exception-handling importerror

如果在源目录中尝试导入模块foo,则会收到一条相当混乱的ImportError消息:ImportError: No module named foo

如何轻松捕获此案例并返回更具信息性的消息,例如'请不要从源目录加载模块foo'?

拥有__init__.py,我会从:

开始
try:
    from _foo import *
except ImportError:
    ## check whether in the source directory...

所以我想区分ImportError的不同原因(例如因为根本没有安装名为foo的模块),并检测setup.py所在的情况位于当前目录中。这样做的优雅方式是什么?

1 个答案:

答案 0 :(得分:28)

ImportError: No module named foo实际上意味着在搜索路径(foo.py列表)中的任何目录中都找不到模块foo/__init__.py或包sys.path

由于sys.path通常包含.(当前目录),这可能是在源目录中的含义。您位于包foo的顶级目录中(__init__.py文件所在的位置),因此您无法找到foo/__init__.py

最后,您或多或少地回答了您自己的问题:

try:
    from _foo import *
except ImportError:
    raise ImportError('<any message you want here>')

或者,您可以检查sys.path的内容,当前目录以及(如果已知)预期的包目录,并生成详细的上下文消息。

或者将..添加到PYTHONPATH环境变量(在U​​nix上)以允许您从源目录运行。甚至可能在Windows上工作,但我不知道。