Ошибка В 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 in основной каталог (где 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/. Согласно документации и пример Я нашел, нос должен добавить все родительские пакеты в путь, а также каталог, из которого он вызывается, но это, похоже, не происходит в моем случае.

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

9 107

9 ответов:

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

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

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

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

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

моя структура каталогов, как это:

./tests/
  ./test_some_random_stuff.py

если бы я побежал nosetests:

nosetests -w tests

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

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

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

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

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

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

find . -name '*.pyc' -delete

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

например, со следующей структурой каталогов, если вы хотите запустить nosetests in m1,m2 или m3 чтобы проверить некоторые функции в n.py, вы должны использовать from m2.m3 import n на test.py.

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

просто для завершения вопроса: Если вы боретесь с такой структурой:

project
├── m1
├    ├── __init__.py
├    ├── foo1.py
├    └──m2
├       ├── __init__.py
├       └── foo2.py
├
└── test
     ├── __init__.py
     └── test.py

и, возможно, вы хотите запустить тест из Пути за пределами проекта, включите свой путь проекта в свой PYTHONPATH.

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

вставьте его в свой .профиль. Если вы находитесь в виртуальной среде, вставьте его в активацию в корне venv