Подтвердить что ты не робот

Ошибка импорта носа Python

Я не могу представить структуру тестирования носа для распознавания модулей под моим тестом script в структуре файла. Я установил простейший пример, демонстрирующий проблему. Я объясню это ниже.

Здесь структура файла пакета:

./__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)

Я получаю ту же ошибку, когда я запускаю изнутри test/directory. Согласно документации и пример, который я нашел, нос должен добавить все родительские пакеты в путь, а также каталог, из которого он вызывается, но это, похоже, не происходит в моем случае.

Я запускаю Ubuntu 8.04 с Python 2.6.2. Я создал и установил нос вручную (не с setup_tools), если это имеет значение.

4b9b3361

Ответ 1

У вас есть __init__.py в вашем каталоге верхнего уровня. Это делает его пакетом. Если вы удалите его, ваш nosetests должен работать.

Если вы не удалите его, вам придется изменить import на import dir.foo, где dir - это имя вашего каталога.

Ответ 2

Вы виртуальный? В моем случае nosetests был в /usr/bin/nosetests, который использовал /usr/bin/python. Пакеты в virtualenv определенно не будут в системном пути. Следующее исправлено:

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

Ответ 3

Другая потенциальная проблема - это дефис/дефисы в дереве каталогов. Недавно я исправил проблему ImportError носа, переименовав каталог с sub-dir на sub_dir.

Ответ 4

К тем из вас, что вы позже найдете этот вопрос: я получаю ошибку импорта, если у меня нет файла __init__.py в моей директории тестов.

Моя структура каталогов была такой:

./tests/
  ./test_some_random_stuff.py

Если я запустил nosetests:

nosetests -w tests

Это даст ImportError, что все остальные видят. Если я добавлю пустой файл __init__.py, он отлично работает:

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

Ответ 5

Конечно, если у вас есть синтаксическая ошибка в импортируемом модуле, это вызовет это. Для меня проблема поднялась, когда у меня была резервная копия файла тестов с таким же способом, как module/tests.bak.py, в том же каталоге, что и test.py. Кроме того, чтобы решить проблему с пакетом/модулем init в приложении Django, вы можете запустить следующее (в оболочке bash/OSX), чтобы убедиться, что у вас нет init.pyc файлы:

find . -name '*.pyc' -delete

Ответ 6

Я получил это сообщение об ошибке, потому что я запускаю команду nosetests из неправильной директории.

Глупо, но бывает.

Ответ 7

Я просто столкнулся с еще одной вещью, которая может вызвать эту проблему: именование тестов в форме testname.test.py. Этот дополнительный . смешивает нос и ведет к тому, что он импортирует вещи, которых он не должен. Я полагаю, что может быть очевидно, что использование нетрадиционных условных условных обозначений будет нарушать все, но я подумал, что это стоит отметить.

Ответ 8

Например, со следующей структурой каталогов, если вы хотите запустить 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