骨架目录:为什么当 nosetests returns 没有错误时脚本会失败?

Skeleton Directory: Why does script fail when nosetests returns no errors?

(在 Debian Linux 上使用 bash 命令行,Python 2.7.12。)

在 Zed Shaw 的 LPTHW 之后,我构建了一个有助于测试软件的项目框架。先说大纲。

设置:

    bin  docs  first_project  setup.py  tests

./bin:

./docs:

./first_project:
__init__.py  wasp.py

./tests:
first_project_tests.py  __init__.py

wasp.py 的内容:

def paint(color):
    print color * 10

first_projects_tests.py 的内容:

from nose.tools import *
from first_project import wasp

def test_paint():
    wasp.paint("blue")

根据我对 Zed Shaw 解释的理解,first_project 目录中的 __init__.py 告诉 Python 其中的文件可以作为模块导入。因此,测试目录中的脚本 first_project_tests.py 从 first_project 目录中导入 wasp.py 模块并从中调用绘制函数。

按照 Shaw 的指示,我 运行 从测试目录上方进行了 nosetests,我得到了零错误的 ok。

然后我切换到测试目录并从命令行输入 python first_project_tests.py,假设我能够 运行 脚本没有问题作为 nosetests命令没有错误。

我收到以下错误:

Traceback (most recent call last):
  File "first_project_tests.py", line 2, in <module>
    from first_project import wasp
ImportError: No module named first_project

那么,当 nosetests returns 没有错误时,为什么 first_project_tests.py 脚本会失败?

Python 从 模块搜索路径 导入相关工作。当前目录自动包含在此路径中。

当你在项目的顶层运行nosetests时,在相对路径中找到了first_project里面有wasp的模块,因为first_project/wasp.py 相对于执行目录存在。

当您进入 tests 并尝试 运行 first_project_tests.py 时,导入语句失败,因为该目录中不存在相对路径 first_project/wasp.py

您可以从项目根目录 运行 像这样:

python tests/first_project_tests.py