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应该工作。

如果您不删除它,则必须更改importimport dir.foo ,其中dirdir的名称。

你在虚拟世界吗? 就我而言, nosetests/usr/bin/nosetests ,它使用/usr/bin/python 。 virtualenv中的包肯定不会在系统path中。 下面解决了这个问题:

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

目录树中的另一个潜在问题似乎是连字符/破折号。 我最近修复了一个鼻子ImportError问题,通过重命名一个从sub-dirsub_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命名约定可能会破坏事物,但我认为这可能值得注意。

例如,对于以下目录结构,如果要运行m1m2m3 nosetests来testingn.py某些函数, n.py应该使用test.py from m2.m3 import n

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