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所在的目录)中运行
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。如果这很重要的话,我已经手工制造和安装了鼻(而不是用安装工具)。
您的顶级目录中有一个
如果您不删除它,则必须将您的
你在虚拟环境中吗?在我的例子中,
1 2 3 4 | source myvirtualenv/activate pip install nose which nosetests /home/me/myvirtualenv/bin/nosetests |
对于那些稍后发现这个问题的人:如果我的测试目录中没有
我的目录结构如下:
1 2 | ./tests/ ./test_some_random_stuff.py |
号
如果我做鼻子测试:
1 | nosetests -w tests |
这将给江户带来其他人都能看到的东西。如果我添加一个空白的
1 2 3 | ./tests/ ./__init__.py ./test_some_random_stuff.py |
。
另一个潜在的问题是目录树中的连字符/破折号。我最近通过将目录从
我收到这个错误消息是因为我从错误的目录运行了
很傻,但发生了。
当然,如果在导入的模块中有语法错误,就会导致这种情况。对我来说,当我备份了一个测试文件时,这个问题就出现了,它的路径类似于module/tests.bak.py,与tests.py在同一个目录中。此外,要处理django应用程序中的init包/模块问题,可以运行以下程序(在bash/osx shell中),以确保周围没有任何init.pyc文件:
1 | find . -name '*.pyc' -delete |
例如,使用以下目录结构,如果要在
1 2 3 4 5 6 7 8 | m1 └── m2 ├── __init__.py └── m3 ├── __init__.py ├── n.py └── test └── test.py |
。
我刚刚遇到了另一个可能引起这个问题的事情:以
只需完成以下问题:如果你正在这样的结构中挣扎:
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中。