Я только что настроил для использования pytest с Python 2.6. До сих пор он работал хорошо, за исключением обработки "импортных" заявлений: я не могу заставить pytest отвечать на импорт так же, как это делает моя программа.
Моя структура каталогов выглядит следующим образом:
src/
main.py
util.py
test/
test_util.py
geom/
vector.py
region.py
test/
test_vector.py
test_region.py
Для запуска я вызываю python main.py
из src/.
В main.py я импортирую как вектор, так и область с помощью
from geom.region import Region
from geom.vector import Vector
В vector.py, я импортирую область с
from geom.region import Region
Все они работают нормально, когда я запускаю код в стандартном прогоне. Однако, когда я вызываю "py.test" из src/, он последовательно выходит с ошибками импорта.
Некоторые проблемы и попытки моего решения
Моя первая проблема заключалась в том, что при запуске "test/test_foo.py" py.test не смог напрямую импортировать foo.py. Я решил это, используя инструмент "imp". В "test_util.py":
import imp
util = imp.load_source("util", "util.py")
Это отлично работает для многих файлов. Также кажется, что когда pytest запускает "path/test/test_foo.py" для проверки "path/foo.py", он находится в каталоге "путь".
Однако это невозможно для "test_vector.py". Pytest может найти и импортировать модуль vector
, но не может найти какой-либо из vector
импорта. Следующий импорт (из "vector.py" ) не работает при использовании pytest:
from geom.region import *
from region import *
Они оба дают ошибки формы
ImportError: No module named [geom.region / region]
Я не знаю, что делать дальше, чтобы решить эту проблему; мое понимание импорта в Python ограничено.
Каков правильный способ обработки импорта при использовании pytest?
Редактировать: Чрезвычайно хакерское решение
В vector.py
я изменил оператор импорта из
from geom.region import Region
просто
from region import Region
Это делает импорт относительно каталога "vector.py" .
Далее, в "test/test_vector.py", я добавляю каталог "vector.py" в путь следующим образом:
import sys, os
sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/.."))
Это позволяет Python находить "../region.py" из "geom/test/test_vector.py".
Это работает, но кажется чрезвычайно проблематичным, потому что я добавляю тонну новых каталогов на путь. То, что я ищу, это либо
1) Стратегия импорта, совместимая с pytest, или
2) Опция в pytest, которая делает ее совместимой с моей стратегией импорта
Поэтому я оставляю этот вопрос открытым для ответов такого рода.