Python鼻子导入错误

Python Nose Import Error

我似乎无法让nose测试框架识别文件结构中测试脚本下的模块。我建立了一个最简单的例子来演示这个问题。我将在下面解释。

包文件结构如下:

1
2
3
4
5
./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py包含:

1
2
def dumb_true():
    return True

测试/测试foo.py包含:

1
2
3
4
import foo

def test_foo():
    assert foo.dumb_true()

两个init.py文件都是空的

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)

当我从测试/目录中运行时,会得到相同的错误。根据文档和我发现的一个示例,nose应该将所有父包添加到路径以及从中调用它的目录中,但在我的情况下似乎不会发生这种情况。

我用python 2.6.2运行Ubuntu8.04。如果这很重要的话,我已经手工制造和安装了鼻(而不是用安装工具)。


您的顶级目录中有一个__init__.py。这使它成为一个包裹。如果你把它取下来,你的nosetests就可以工作了。

如果您不删除它,则必须将您的import更改为import dir.foo,其中dir是您的目录名。


你在虚拟环境中吗?在我的例子中,nosetests/usr/bin/nosetests中使用/usr/bin/python的那个。virtualenv中的包肯定不会在系统路径中。以下修复了此问题:

1
2
3
4
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests


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

我的目录结构如下:

1
2
./tests/
  ./test_some_random_stuff.py

如果我做鼻子测试:

1
nosetests -w tests

这将给江户带来其他人都能看到的东西。如果我添加一个空白的__init__.py文件,它会很好地工作:

1
2
3
./tests/
  ./__init__.py
  ./test_some_random_stuff.py


另一个潜在的问题是目录树中的连字符/破折号。我最近通过将目录从sub-dir重命名为sub_dir,修复了一个nose importerror问题。


我收到这个错误消息是因为我从错误的目录运行了nosetests命令。

很傻,但发生了。


当然,如果在导入的模块中有语法错误,就会导致这种情况。对我来说,当我备份了一个测试文件时,这个问题就出现了,它的路径类似于module/tests.bak.py,与tests.py在同一个目录中。此外,要处理django应用程序中的init包/模块问题,可以运行以下程序(在bash/osx shell中),以确保周围没有任何init.pyc文件:

1
find . -name '*.pyc' -delete


例如,使用以下目录结构,如果要在m1中运行nosetestsm2m3来测试n.py中的某些函数,则应在test.py中使用from m2.m3 import n

1
2
3
4
5
6
7
8
m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py


我刚刚遇到了另一个可能引起这个问题的事情:以testname.test.py的形式命名测试。额外的埃多克斯1(14)把鼻子弄糊涂了,导致它进口了它不应该进口的东西。我想很明显,使用非常规的测试命名约定会破坏一切,但我认为这可能值得注意。


只需完成以下问题:如果你正在这样的结构中挣扎:

1
2
3
4
5
6
7
8
9
10
11
project
├── m1
├    ├── __init__.py
├    ├── foo1.py
├    └──m2
├       ├── __init__.py
├       └── foo2.py

└── test
     ├── __init__.py
     └── test.py

也许你想从项目之外的路径运行测试,将项目路径包含在您的pythonpath中。

1
export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

将其粘贴到.profile中。如果您处于虚拟环境中,请将其粘贴到venv根目录中的activate中。