如果在源目录中尝试导入模块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
所在的情况位于当前目录中。这样做的优雅方式是什么?
答案 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
环境变量(在Unix上)以允许您从源目录运行。甚至可能在Windows上工作,但我不知道。