Coverage.py中的“无源代码”消息

59 投票
12 回答
27248 浏览
提问于 2025-04-15 20:03

我昨晚成功地运行了一次构建。今天早上,我又运行了一次,但没有更改任何配置或修改任何源代码。现在我的构建失败了,出现了“没有代码源”的提示,当我用nosetestscoverage运行时。

NoSource: No source for code: '/home/matthew/.hudson/jobs/myproject/workspace/tests/unit/util.py'
. . . 
No source for code: '/home/matthew/.hudson/jobs/myproject/workspace/__init__.py'

我唯一的线索是,它说找不到的文件其实根本就不存在,而且它们本来就不应该存在。 比如,在后面的例子中,Hudson的工作空间并不是一个Python模块,所以__init__.py文件不会存在。

更新:我确认这不是Hudson的问题。当我在目录中直接运行nosetests和coverage时,我也看到了类似的提示。同样,coverage要找的文件一开始就不存在,这让我感到很困惑。

12 个回答

18

总结: 在运行 nosetests --with-coverage 时,旧的 .coverage 数据会被保留,所以要先把它删掉。

详细信息: 我也在使用 Hudson 和 nosetests 时遇到了这个问题。这个错误来自 coverage/results.py:18(使用的是 coverage 3.3.1 - 这里有三个地方抛出了这个错误,但这个是最相关的)。它试图打开与实际被追踪的模块对应的 .py 文件。下面是一个简单的演示:

$ echo print > hello.py
$ echo import hello > main.py
$ coverage run main.py

$ rm hello.py
$ coverage xml
No source for code: '/tmp/aoeu/hello.py'

显然,我有一个执行过的 stopwords.pyc 文件,但没有 stopwords.py 文件。然而在我的代码中并没有导入 stopwords,即使删除了 .pyc 文件,我仍然收到了这个错误。

简单地运行 strings .coverage 后发现,stopwords.py 的引用依然存在。nosetests --with-coverage 使用了 coverage 的追加或合并功能,这意味着旧的 .coverage 数据仍然存在。确实,删除 .coverage 文件解决了这个问题。

52

确保那里没有 .pyc 文件,这个文件可能之前存在过。

59

我不太明白为什么它会认为那个文件存在,不过你可以通过加一个 coverage xml -i 的选项来让 coverage.py 忽略这些问题。

如果你想找出错误的原因,可以给我发个消息(ned at ned batchelder com)。

撰写回答