Python鼻子导入错误
我似乎无法得到鼻子testing框架识别文件结构中我的testing脚本下面的模块。 我已经设置了最简单的例子来演示这个问题。 我会在下面解释。
这是包文件结构:
./__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文件都是空的
如果我在主目录(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)
当我从tests /目录下运行时遇到同样的错误。 根据我发现的文档和示例 ,nose应该将所有父包添加到path以及从中调用它的目录,但是对于我而言,这似乎不会发生。
我用Python 2.6.2运行Ubuntu 8.04。 如果有问题,我已经手动构build并安装了鼻子(不包括setup_tools)。
您的顶级目录中有一个__init__.py
。 这使它成为一个包装。 如果你删除它,你的nosetests
应该工作。
如果您不删除它,则必须更改import
以import dir.foo
,其中dir
是dir
的名称。
你在虚拟世界吗? 就我而言, nosetests
是/usr/bin/nosetests
,它使用/usr/bin/python
。 virtualenv中的包肯定不会在系统path中。 下面解决了这个问题:
source myvirtualenv/activate pip install nose which nosetests /home/me/myvirtualenv/bin/nosetests
目录树中的另一个潜在问题似乎是连字符/破折号。 我最近修复了一个鼻子ImportError问题,通过重命名一个从sub-dir
到sub_dir
sub-dir
。
对于那些后来发现这个问题的人来说:如果我的testing目录中没有__init__.py
文件,我会得到导入错误。
我的目录结构是这样的:
./tests/ ./test_some_random_stuff.py
如果我跑鼻子testing:
nosetests -w tests
这会导致其他人都看到的ImportError
。 如果我添加一个空白__init__.py
文件,它工作得很好:
./tests/ ./__init__.py ./test_some_random_stuff.py
当然,如果在导入的模块中有语法错误,会导致这个错误。 对于我来说,如果我在test.py的同一个目录中备份了一个像module / tests.bak.py这样的path的testing文件,那么问题就开始了。 此外,要处理Django应用程序中的init包/模块问题,可以运行以下命令(在bash / OSX shell中)以确保没有任何初始化 .pyc文件:
find . -name '*.pyc' -delete
我得到这个错误消息,因为我从错误的目录运行nosetests
命令。
傻,但发生。
我只是遇到了一件可能导致这个问题的事情:以testname.test.py
的forms命名testing。 那额外的.
混淆鼻子,导致它导入不应该的东西。 我认为使用非常规的testing命名约定可能会破坏事物,但我认为这可能值得注意。
例如,对于以下目录结构,如果要运行m1
, m2
或m3
nosetests
来testingn.py
某些函数, n.py
应该使用test.py
from m2.m3 import n
。
m1 └── m2 ├── __init__.py └── m3 ├── __init__.py ├── n.py └── test └── test.py