Python鼻子导入错误

hal*_*fak 117 python nose python-import

我似乎无法使用鼻子测试框架来识别文件结构中测试脚本下面的模块.我已经设置了一个最简单的例子来演示这个问题.我将在下面解释.

这是包文件结构:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py
Run Code Online (Sandbox Code Playgroud)

foo.py包含:

def dumb_true():
    return True
Run Code Online (Sandbox Code Playgroud)

tests/test_foo.py包含:

import foo

def test_foo():
    assert foo.dumb_true()
Run Code Online (Sandbox Code Playgroud)

两个init .py文件都是空的

如果我nosetests -vv在主目录(foo.py所在)中运行,我得到:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)

当我从tests /目录中运行时,我得到了同样的错误.根据我发现的文档和示例,鼻子应该将所有父包添加到路径以及调用它的目录,但在我的情况下似乎没有发生这种情况.

我正在使用Python 2.6.2运行Ubuntu 8.04.如果重要的话,我手动构建并安装了鼻子(不是使用setup_tools).

ire*_*ses 219

__init__.py的顶级目录中有一个.这使它成为一个包.如果你删除它,你nosetests应该工作.

如果不删除它,你必须改变你importimport dir.foo,哪里dir是你的目录的名称.

  • 得到了它.非常感谢!我投了票,但显然我需要更多声望. (6认同)
  • 别担心.欢迎来到StackOverflow!如果答案解决了您的问题,您可以勾选左侧的绿色复选标记. (4认同)
  • 我有一种情况,如果根目录中的__init__.py测试有效 - 但是,我*需要*那个文件,并且*导入模型.<model_name>*仍然找不到.测试在*tests/*目录中,我试图测试的模型在*models/*目录中...任何帮助将不胜感激. (4认同)
  • @halfak:然后再对你的问题进行另一次投票.你也(你的回答),@. (2认同)

top*_*pur 31

你是一个虚拟的人吗?在我的情况下,nosetests/usr/bin/nosetests正在使用的那个/usr/bin/python.virtualenv中的软件包绝对不会出现在系统路径中.以下修正了这个:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
Run Code Online (Sandbox Code Playgroud)

  • 此外,我不得不停用并激活我的virtualenv. (5认同)
  • 这是我的问题 - 非常感谢! (3认同)
  • 对于我来说,`nosetests`被`bash`缓存到`/ usr/local/bin`中的系统中(而`nosetests`给出了正确的结果).我使用[this](http://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables)来清除它. (3认同)
  • 也是我的.谢谢,节省了很多时间. (2认同)

rob*_*rit 12

对于那些你以后发现这个问题的人:如果__init__.py我的测试目录中没有文件,我会收到导入错误.

我的目录结构是这样的:

./tests/
  ./test_some_random_stuff.py
Run Code Online (Sandbox Code Playgroud)

如果我跑鼻子测试:

nosetests -w tests
Run Code Online (Sandbox Code Playgroud)

这会让ImportError其他人都看到.如果我添加一个空白__init__.py文件,它可以正常工作:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
Run Code Online (Sandbox Code Playgroud)


Aro*_*dia 10

另一个潜在的问题似乎是目录树中的连字符/破折号.我最近通过重命名目录sub-dir来修复了一个鼻子ImportError问题sub_dir.