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

Jul*_*ian 23 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...
Run Code Online (Sandbox Code Playgroud)

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

ise*_*dev 31

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

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

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

try:
    from _foo import *
except ImportError:
    raise ImportError('<any message you want here>')
Run Code Online (Sandbox Code Playgroud)

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

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