问题:Python鼻子导入错误
我似乎无法获得鼻子测试框架来识别文件结构中测试脚本下的模块。我设置了最简单的示例来演示该问题。我会在下面解释。
这是包文件的结构:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py包含:
def dumb_true():
return True
tests / test_foo.py包含:
import foo
def test_foo():
assert foo.dumb_true()
两个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)
当我从tests /目录中运行时,出现相同的错误。根据文档和我发现的示例,nose应该将所有父包都添加到路径以及调用它的目录中,但是在我看来,这似乎没有发生。
我正在使用Python 2.6.2运行Ubuntu 8.04。如果重要的话,我已经手动构建并安装了鼻子(不使用setup_tools)。
回答 0
您__init__.py
的顶级目录中有一个。这使其成为一个包装。如果将其删除,则nosetests
应该可以工作。
如果不删除它,则必须将其更改import
为import dir.foo
,这dir
是目录名。
回答 1
您在虚拟环境中吗?就我而言,nosetests
是中的/usr/bin/nosetests
,正在使用/usr/bin/python
。virtualenv中的软件包肯定不会在系统路径中。以下解决了此问题:
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
回答 2
对于那些以后会发现此问题的人:如果__init__.py
我的tests目录中没有文件,则会出现导入错误。
我的目录结构是这样的:
./tests/
./test_some_random_stuff.py
如果我进行了鼻子测试:
nosetests -w tests
它会给ImportError
其他人看到的。如果我添加一个空白__init__.py
文件,则可以正常工作:
./tests/
./__init__.py
./test_some_random_stuff.py
回答 3
另一个潜在的问题似乎是目录树中的连字符/破折号。我最近通过重命名目录固定鼻子导入错误的问题sub-dir
来sub_dir
。
回答 4
当然,如果在导入的模块中存在语法错误,则会导致此错误。对我来说,当我备份一个tests文件时,这个问题浮出水面,该文件的路径与modules / tests.bak.py类似,位于与tests.py相同的目录中。另外,要处理Django应用程序中的init包/模块问题,可以运行以下命令(在bash / OSX shell中)以确保周围没有任何init .pyc文件:
find . -name '*.pyc' -delete
回答 5
我收到此错误消息是因为我nosetests
从错误的目录运行命令。
傻了,但是发生了。
回答 6
我只是碰到另一件事可能导致这个问题:以形式命名测试testname.test.py
。多余的.
东西会使鼻子感到困惑,并导致它导入它不应该导入的东西。我想很明显,使用非常规的测试命名约定会破坏事情,但是我认为可能值得注意。
回答 7
例如,下面的目录结构,如果你想运行nosetests
中m1
,m2
或m3
以测试某些功能n.py
,你应该使用from m2.m3 import n
的test.py
。
m1
└── m2
├── __init__.py
└── m3
├── __init__.py
├── n.py
└── test
└── test.py
回答 8
只需完成一个问题:如果您正在为这样的结构而苦苦挣扎:
project
├── m1
├ ├── __init__.py
├ ├── foo1.py
├ └──m2
├ ├── __init__.py
├ └── foo2.py
├
└── test
├── __init__.py
└── test.py
也许您想从项目外部的路径运行测试,将项目路径包含在PYTHONPATH中。
export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project
将其粘贴到您的.profile中。如果您处于虚拟环境中,请将其粘贴到venv根目录中的Activate中