Ошибка импорта носа 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 в основном каталоге (где находится 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), если это важно.


person halfak    schedule 18.06.2010    source источник


Ответы (9)


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

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

person ire_and_curses    schedule 18.06.2010
comment
Вот и все. Большое спасибо! Я бы проголосовал за, но, видимо, мне нужно больше репутации. - person halfak; 19.06.2010
comment
Не беспокойся. Добро пожаловать в StackOverflow! Вы можете отметить зеленую галочку слева, если ответ решает вашу проблему. - person ire_and_curses; 19.06.2010
comment
@halfak: Тогда еще раз проголосуйте за свой вопрос. Ты тоже (на свой ответ), @ire. - person Mark Rushakoff; 19.06.2010
comment
Понятно. Спасибо за совет :) - person halfak; 22.06.2010
comment
У меня есть ситуация, когда тесты работают, если init .py в корневом каталоге - однако мне нужен этот файл и импортировать модели. ‹Model_name› < / i> до сих пор не найден. Тест находится внутри каталога tests /, а модель, которую я пытаюсь протестировать, находится внутри каталога models / ... любая помощь будет принята с благодарностью. - person Kees Briggs; 12.03.2016
comment
В дополнение к init .py мне также пришлось удалить init .pyc. Потом нос смогли завезти второй класс. - person Tom Anderson; 27.06.2016
comment
Что, если я не хочу удалять __init__.py, потому что foo.py имеет функции, которые я хотел бы импортировать где-то еще, и я не хочу изменять импорт, потому что тогда мне придется установить PYTHONPATH по-разному внутри и снаружи носа? Этот вопрос также находится в stackoverflow.com/questions/60352884/ - person dfrankow; 22.02.2020
comment
Кроме того, почему нос делает это, и можно ли отключить это поведение? Очевидно, что у многих людей с этим возникнут проблемы, так как ваш ответ получил сотни положительных голосов. - person dfrankow; 22.02.2020

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

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
person toppur    schedule 23.03.2014
comment
Тоже мое. Спасибо, сэкономили много времени. - person jon skulski; 28.08.2015
comment
для меня nosetests был кеширован bash в системный в /usr/local/bin (в то время как which nosetests давал правильный результат). Я использовал это, чтобы очистить его . - person Raffi; 20.11.2015
comment
Кроме того, мне пришлось деактивировать и активировать мой файл virtualenv. - person Bengt; 20.02.2016
comment
У меня была проблема с параметром PS1 = $ {PS1: -}, установленным при активации virtualenv (для устранения ошибок в неустановленных переменных). После удаления этого и переключения на set + u у меня больше не было проблем. - person Juuso Ohtonen; 17.01.2018

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

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

./tests/
  ./test_some_random_stuff.py

Если я пробежал носовые тесты:

nosetests -w tests

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

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
person robbrit    schedule 23.01.2014

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

person Aron Ahmadia    schedule 15.06.2012
comment
@Nakilon stackoverflow.com/questions/2064329/ - person Aman; 03.06.2013
comment
@Aman, вы понимаете разницу между идентификаторами переменных и именами файлов? - person Nakilon; 04.06.2013
comment
Да ... У меня всегда есть файл, который был похож на FooTests.py, и он по какой-то причине не нравился ... Я переименовал его в Foo_Tests.py, и он работал ... кажется немного привередливым. - person Birdman; 03.12.2018

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

find . -name '*.pyc' -delete
person hobs    schedule 29.05.2013

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

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

person Eyal Levin    schedule 02.08.2016
comment
Не могли бы вы добавить некоторые детали к своему ответу? Из какого каталога вы его запускали? Почему это неправильно? Какой каталог будет правильным? Запуск nosetests в каталоге без тестов приведет к Ran 0 tests, а не к ошибке импорта. В нынешнем виде этот ответ бесполезен. - person gerrit; 19.02.2019

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

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

person 7yl4r    schedule 01.10.2015

Просто завершу вопрос: если вы боретесь с такой структурой:

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

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

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

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

person Rainelz    schedule 29.05.2018