Python 鼻子导入错误

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

下面是软件包的文件结构:

./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py

foo.py contains:

def dumb_true():
return True

Test/test _ foo.py 包含:

import foo


def test_foo():
assert foo.dumb_true()

Both Init.py files are empty

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

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)

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

我正在用 Python 2.6.2运行 Ubuntu 8.04。如果需要的话,我已经手动构建和安装了 nose (不是用 setup _ tools)。

54026 次浏览

在您的顶级目录中有一个 __init__.py。那就是一个包裹。如果你移除它,你的 nosetests应该工作。

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

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

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

find . -name '*.pyc' -delete

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

我的目录结构是这样的:

./tests/
./test_some_random_stuff.py

如果我做鼻测试:

nosetests -w tests

它会给 ImportError带来其他人都能看到的效果。如果我添加一个空白的 __init__.py文件,它工作得很好:

./tests/
./__init__.py
./test_some_random_stuff.py

你在虚拟世界里吗?在我的例子中,nosetests是使用 /usr/bin/python/usr/bin/nosetests。Virtual alenv 中的包肯定不会出现在系统路径中。以下修正了这一点:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests

我只是碰到了另外一件可能导致这个问题的事情: 以 testname.test.py的形式命名测试。额外的 .混淆了鼻子,导致它导入不应该导入的东西。我认为使用非传统的测试命名约定会打破常规,这一点可能是显而易见的,但我认为这可能值得注意。

例如,对于以下目录结构,如果您想在 m1m2m3中运行 nosetests来测试 n.py中的某些函数,那么您应该在 test.py中使用 from m2.m3 import n

m1
└── m2
├── __init__.py
└── m3
├── __init__.py
├── n.py
└── test
└── test.py

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

有点傻,但还是发生了。

只是为了完成这个问题: 如果你纠结于这样的结构:

project
├── m1
├    ├── __init__.py
├    ├── foo1.py
├    └──m2
├       ├── __init__.py
├       └── foo2.py
├
└── test
├── __init__.py
└── test.py

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

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

粘贴到您的。配置文件中。 如果您在一个虚拟环境下,将其粘贴到 venv 根目录的激活中