Coverage.py 中出现的 "No source for code" 错误信息

59

昨晚我进行了一次构建,成功了。今天早上我又运行了一次构建,没有更改任何配置或修改任何源代码。现在当我使用coverage运行nosetests时,我的构建失败并出现消息"No source for code"

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的问题。当我在目录本身中使用coverage运行nostests时,我看到类似的消息。同样,coverage正在寻找的文件从一开始就不存在,这使得这个问题非常令人困惑。

如果您进行了干净的检出,它是否会再次正常工作?也许构建过程正在留下一些东西,混乱了工作空间。 - Dave Bacher
我已经清空了工作区并重新构建,但仍然出现相同的错误。我甚至将作业复制到一个新名称下。还有其他什么方法可以确保它是“干净的检出”吗? - Matt Norris
12个回答

57

我不确定为什么它认为该文件存在,但是您可以使用coverage xml -i命令告诉coverage.py忽略这些问题。

如果您想追踪错误,请给我发邮件(ned at ned batchelder com)。


1
谢谢,Ned。在你的网站上有关于-i标志的文档吗?我可能错过了它。你介意发一下链接吗? - Matt Norris
嗯,既然你提到了,文档似乎没有提到-i,不过命令行帮助 (coverage help xml) 有提到。 - Ned Batchelder
@NedBatchelder 我现在遇到了同样的问题。报告显示找不到projectroot/views.py,但是在项目的根目录中并没有views.py。就像在查找源文件之前忘记了该模块一样,所以它在根目录中查找,而应该在root/application/views.py中查找。你有任何开始调试的想法吗?或者你知道django/nosetest的包装器中是否暴露了'-i'来进行覆盖测试? - Ry4an Brase
3
在我的情况下,我有一个名为 __init__.py 的文件,在导入后创建了一个名为 __init__.pyc 的文件。然后,我删除了 __init__.py,但忘记了 .pyc 文件,所以 coverage.py 感到困惑。在删除 __init__.pyc 后,一切都恢复正常了。 - xbello
实际需要做的是清理所有的 .pyc 文件,然后删除 .coverage 文件。 - Azamat Tokhtaev
我们在这里谈论的是 pytests 目录中的 *.pyc 文件吗?我的问题是运行 coverage report 会要求获取队友电脑上的文件,因此我们有一些被 Git 追踪但不应该被追踪的内容。我正在努力弄清楚其中的原因。 - pauljohn32

51

确保那里没有任何可能存在的过去的 .pyc 文件。


5
在我的情况下,这正是有帮助的 - 删除所有的 *.pyc 以及 .coverage 和所有存在的 xml 文件。 - xaralis
2
太棒了!这应该是被采纳的答案 :) - Henrique Goulart

17

简述: 使用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,即使删除了.py文件,我仍然遇到了错误。

简单地运行strings .coverage,就发现对stopwords.py的引用仍然存在。nosetests --with-coverage使用了覆盖率工具的追加或合并功能,这意味着旧的.coverage数据仍然存在。事实上,删除.coverage解决了这个问题。


3
很高兴看到你找到了问题的根源。顺便说一下,不要使用strings .coverage,而是可以使用coverage debug data命令,它会给出.coverage文件中数据的摘要。请注意不要改变原意。 - Ned Batchelder

10

只需要使用'--cover-erase'参数。它可以修复此错误,无需手动删除覆盖率文件。

nosetests --with-coverage --cover-erase

我强烈建议查看帮助文件,以了解您还缺少哪些参数,别忘了那些插件。


8
问题是 .pyc 文件仍然存在。
一个快速而不太完美的解决方案是删除该目录中的所有 .pyc 文件:
find . -name "*.pyc" -exec rm -rf {} \;

6
一个快捷方式:find . -name "*.pyc" -delete。该命令用于在当前目录及其子目录中查找所有扩展名为".pyc"的文件并将其删除。 - slackmart

1

coverage report -m 可以直接调用,无需提供任何参数(请参见官方快速指南)。 但它只能在第一个脚本 coverage 上运行,而不能在第二个脚本上运行。例如:

coverage run -m f1.py
coverage report -m # works
coverage run -m f2.py
coverage report -m # fails (f2.py instead of f1.py in last coverage run)

相反,始终将脚本作为 coverage report -m 的参数指定:

file="f2.py" && coverage run $file && coverage report -m $file

Coverage reporting docs


1
我在尝试通过setuptools运行nosetests覆盖率时也遇到了这个问题。正如提到的那样,可以删除现有的.pyc文件,但这可能很麻烦。
最终,我不得不创建一个.coveragerc文件,并添加以下内容以解决此错误:

[report]

ignore_errors = True


3
与其忽视问题,不如了解并纠正它。忽略可以处理的错误通常是糟糕的做法。 - pauljohn32
这真的为我解决了问题。谢谢。 - remustata

0
我曾经遇到过这个问题。pytest-cov声称已经覆盖了有效代码的文件中没有代码。我通过删除.coverage文件来消除这些警告。当然,下一次运行时会重新创建该文件。

0
也许这可以帮到你,但我今天遇到了一个类似的错误。它是一个权限错误。我的代码正在使用另一个用户的checkout(按设计,不能询问),所以我需要sudo才能使coverage工作。因此,你的问题可能与此有关。

0
另一个案例,但无论如何... 不要像我一样愚蠢,只使用coverage html,而不是coverage report html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接