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

Django находит тесты, но не импортирует их

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

Версия

Python 3.4

Django 1.7b4

Моя файловая структура

выглядит так (только соответствующие биты):

inkasso
├── db.sqlite3
├── functional_tests
│   ├── base.py
│   ├── base.pyc
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── __pycache__
│   ├── test_login.py
│   └── test_login.pyc
├── __init__.py
├── inkasso
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── migrations
│   ├── models.py
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── static
│   ├── ...
├── templates
│   ├── ...
└── web
    ├── admins.py
    ├── tests
    │   ├── __init__.py
    │   ├── test_forms.py
    │   ├── test_models.py
    │   └── test_views.py
    ├── urls.py
    └── views.py

Трассировка стека

Поэтому, когда я запускаю ./manage.py test, я получаю следующий stak-trace:

 $ ./manage.py test
Creating test database for alias 'default'...
EEEE
======================================================================
ERROR: inkasso.functional_tests.test_login (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
    yield
  File "/usr/lib/python3.4/unittest/case.py", line 574, in run
    testMethod()
  File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: inkasso.functional_tests.test_login
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
    __import__(name)
ImportError: No module named 'inkasso.functional_tests'


======================================================================
ERROR: inkasso.web.tests.test_forms (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
    yield
  File "/usr/lib/python3.4/unittest/case.py", line 574, in run
    testMethod()
  File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_forms
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
    __import__(name)
ImportError: No module named 'inkasso.web'


======================================================================
ERROR: inkasso.web.tests.test_models (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
    yield
  File "/usr/lib/python3.4/unittest/case.py", line 574, in run
    testMethod()
  File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_models
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
    __import__(name)
ImportError: No module named 'inkasso.web'


======================================================================
ERROR: inkasso.web.tests.test_views (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor
    yield
  File "/usr/lib/python3.4/unittest/case.py", line 574, in run
    testMethod()
  File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
    raise exception
ImportError: Failed to import test module: inkasso.web.tests.test_views
Traceback (most recent call last):
  File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
    __import__(name)
ImportError: No module named 'inkasso.web'


----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (errors=4)
Destroying test database for alias 'default'...

Итак, тестовый бегун находит мои тесты, но по какой-то причине они не импортируются. Я понятия не имею, что происходит. Трассировка стека не очень помогает мне: (

Поскольку корневая папка называется inkasso и имеет модуль с тем же именем, я попытался помещать print(os.getcwd) и print(sys.path) в manage.py, и все, что было показано, это то, что CWD и path были установлены как укажите в корневой папке, так что все должно быть хорошо, нет? Само приложение работает так, как ожидалось. Это только те тесты, которые не работают.

Для хихиканья я попытался создать пустой модуль "web" в inkasso.inkasso, в результате чего вместо жалобы на то, что inkasso.web не существует, он теперь жалуется, что inkasso.web.tests не существует. Таким образом, это показывает, что вместо поиска в корневой папке "inkasso" она выглядит в "inkasso.inkasso". Вот в чем проблема. Как я могу это исправить?

4b9b3361

Ответ 1

Да... есть проблема с запуском ./manage.py, поскольку он добавляет текущий каталог в PYTHONPATH.

Эта проблема возникает, если вы помещаете __init__.py в корневую папку.

Одним из решений было бы в этом случае никогда не использовать manage.py, а только django-admin.py <commands> --settings=inkasso.inkasso.settings - конечно, это предполагает либо, что при выполнении этой команды вы на один уровень выше своей корневой папки inkasso, или ваш основной пакет установлен в site-packages.

Например, если полный путь к вашему файлу settings.py равен /home/user/projects/inkasso/inkasso/settings.py, вы должны находиться в /home/user/projects при выполнении этой команды.

Если, однако, ваш пакет установлен в ваших пакетах сайтов, это ограничение имеет следующие ограничения: вы можете быть где угодно, кроме /home/user/projects/inkasso или любой из его подпапок или так далее.

Другое решение - отредактировать файл manage.py, чтобы добавить эту строку:

if __name__ =='__main__': #line already present
    #this will make the python interpreter see your packages as inkasso.inkasso.whatever
    os.chdir('..')  # <<<---This is what you want to add

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mvod.dev_settings")
    ....