2015-11-17 23 views
3
my_project 
    -my_project 
     - __init__.py 
     - main.py 
     - constants.py 
     -test 
      - __init__.py 
      - test_main.py 

test_main.py from my_project import mainПолучение ImportError при запуске nosetests

main.py import constants

Когда я бегу nosetests в my_project, я в конечном итоге получить ImportError: No module named 'constants'

Оба __init__.py файлы являются пустыми.

Если я меняю import constants на from my_project import constants в main.py, носитет работы. Однако теперь, если я просто запустил python main.py, я получаю ImportError: No module named 'my_project'.

Может кто-нибудь помочь мне указать, что я делаю неправильно? Я обыскал несколько сообщений, но сам не смог их исправить. Благодарю.

+0

Если вы не работаете с my_project (или его родительским каталогом), вам нужно указать Python, где искать ваш модуль. Вы можете добавить свой путь my_project к 'sys.path', чтобы заставить его посмотреть там. –

+0

Я вижу, но я запускаю 'nosetests' из my_project (родительский каталог), и я также попытался запустить его в другом каталоге my_project (child). В обоих случаях я получаю 'ImportError: Нет модуля с именем 'константы''. – koreebay

ответ

1

В main.py ->import constants - неявный относительный импорт (плохой). Его следует заменить на более обычный from my_project import constants.

Вы упомянули, что это делает носетисты. Примечание: вам не нужен __init__.py в подкаталоге тестов, и на самом деле это обычно обескураживает.

Теперь, чтобы исправить вашу ошибку python main.py с ошибкой импорта, хорошо, что это нормально, если вы не включили ее в свой sys.path. Существуют различные способы обойти это -

  • выполнить из корневой директории проекта (т.е. верхний my_project один)
  • установить среду PYTHONPATH переменную
  • правильно упаковать и установить приложение с помощью Setuptools/easy_install и т.д.
+0

Спасибо. Я буду избегать неявного относительного импорта и удалить '__init __. Py'from подкаталог тестов. Похоже, что выполнение из корневого каталога проекта все еще не решает проблему. Я думаю, что это объясняется [ответом Эверта] (http://stackoverflow.com/a/33767277/5573312), но я рассмотрю его больше. – koreebay

1

Вы пытаетесь относительный импорт в стиле Python 2 в проекте Python 3: import constants будет в Python 3 попытаться импортировать constants на основном уровне sys.path.

Вместо этого использовать что-то вроде

from . import constants 

в main.py

Смотрите, например PEP 404:

In Python 3, implicit relative imports within packages are no longer available - only absolute imports and explicit relative imports are supported.

и this SO question.

+0

Спасибо.Поскольку я относительно новичок в этом, я не знал, что Python 3 не допускает неявного относительного импорта. Я рассмотрю ваше предложение и просмотрю вашу предоставленную ссылку. – koreebay