32

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

我怎样才能轻松地捕捉到这种情况并返回更多信息性消息,例如“请不要从源目录加载模块 foo”?

有了__init__.py,我将从:

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

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

4

1 回答 1

46

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

由于sys.path通常包含.(当前目录),这可能就是您在源目录中的意思。您位于 package 的顶级目录foo__init__.py文件所在的位置),所以显然您找不到foo/__init__.py.

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

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

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

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

于 2013-02-07T12:18:43.730 回答