Python在使用coverage和nose时无法识别子模块

1 投票
1 回答
1143 浏览
提问于 2025-04-16 18:03

我在用coverage.py运行一组测试时遇到了导入错误,这组测试是用nose这个测试工具来跑的。如果我直接用Python来运行这些测试,就没有问题。

coverage run run_tests.py
ERROR

======================================================================
ERROR: <nose.suite.ContextSuite context=nova.tests>
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 208, in run
    self.setUp()
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 291, in setUp
    self.setupContext(ancestor)
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 314, in setupContext
    try_run(context, names)
  File "/Users/lorin/nova/hpc-trunk/.nova-venv/lib/python2.6/site-packages/nose/util.py", line 478, in try_run
    return func()
  File "/Users/lorin/nova/trunk/nova/tests/__init__.py", line 43, in setup
    from nova import context
ImportError: cannot import name context

这个问题看起来不是路径错误,而是当我用“coverage run”来运行测试时,"nova"模块的子模块无法被找到。我是通过在出错的方法中添加以下代码发现这个问题的:

import nova; print nova.__path__
print dir(nova)

当我用 python run_tests.py 运行时,我看到以下输出:

['/Users/lorin/nova/hpc-trunk/nova']
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 
 'api', 'auth', 'compute', 'console', 'context', 'crypto', 'db', 'exception', 
 'fakerabbit', 'flags', 'image', 'ipv6', 'log', 'manager', 'network', 'objectstore', 
 'quota', 'rpc', 'scheduler', 'service', 'test', 'tests', 'twistd', 'utils', 'version', 
 'virt', 'vnc', 'volume', 'wsgi']

但是,当我用 coverage run run_tests.py 运行时,我看到的输出是:

['/Users/lorin/nova/hpc-trunk/nova']
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 
 'api', 'tests']

看起来在这两种情况下,nova模块都是在同一个地方被找到的,但当我用coverage运行时,Python却看不到大部分子模块,比如(auth, compute, ...)console。

需要注意的是,当我使用nose的coverage插件时,这个问题就不会出现,但在这个特定情况下,我不想使用这个插件。

1 个回答

2

这个问题出在coverage.py这个工具上。当它把当前目录加到sys.path列表里时,没有使用绝对路径,这就导致了这个问题。现在,coverage.py已经修复了这个问题:https://bitbucket.org/ned/coveragepy/changeset/811ed58de8a3

撰写回答