Ошибка импорта носа Python - PullRequest
117 голосов
/ 19 июня 2010

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

Вот структура файла пакета:

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

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

Ответы [ 9 ]

216 голосов
/ 19 июня 2010

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

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

29 голосов
/ 23 марта 2014

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

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
12 голосов
/ 24 января 2014

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

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

./tests/
  ./test_some_random_stuff.py

Если я проводил тестирование носа:

nosetests -w tests

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

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
10 голосов
/ 15 июня 2012

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

3 голосов
/ 02 августа 2016

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

Глупо, но происходит.

3 голосов
/ 30 мая 2013

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

find . -name '*.pyc' -delete
2 голосов
/ 27 июля 2016

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

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

1 голос
/ 29 мая 2018

Просто для того, чтобы завершить вопрос: если вы боретесь со структурой, подобной этой:

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

...