Ошибка В 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 ответов:
у тебя есть
__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
inm1
,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