Импорт родительского каталога для кратких тестов
Я искал этот сайт сверху вниз, но так и не нашел ни одного способа действительно выполнить то, что я хочу в Python3x. Это простое игрушечное приложение, поэтому я подумал, что могу написать несколько простых тестовых примеров в утверждениях и назвать это днем. Он генерирует отчеты и тому подобное, поэтому я хотел бы убедиться, что мой код не делает ничего шаткого при изменениях.
Моя текущая структура каталогов: (включены только соответствующие части)
project
-model
__init__.py
my_file.py
-test
my_file_test.py
У меня чертовски много времени получается, когда my_file_test.py импортирует my_file.py.
Как я уже сказал. Я искал этот сайт сверху вниз, и решение не сработало. Моя версия Python 3.2.3 работает на Fedora 17.
Попытки, предпринятые ранее: /questions/22986832/kak-vyipolnit-otnositelnyij-import-v-python Импорт модулей из родительской папки Кто-нибудь может объяснить относительный импорт python? Как выполнить относительный импорт в Python
Практически в каждой попытке я получаю сообщение об ошибке:
ImportError: Нет модуля с именем * OR ValueError: Попытка относительного импорта в не пакет
Что здесь происходит. Я попробовал каждый принятый ответ на SO, а также во всех сетях. Не занимаясь здесь чем-то необычным, но как программист.NET/Java/Ruby, это доказывает абсолютное определение интуитивности.
РЕДАКТИРОВАТЬ: Если это имеет значение, я попытался загрузить класс, который я пытаюсь импортировать в REPL, и я получаю следующее:
>>> import datafileclass
>>> datafileclass.methods
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
>>> x = datafileclass('sample_data/sample_input.csv')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
Если это имеет значение... Я знаю, что функциональность в классе работает, но я не могу импортировать его, что в настоящее время вызывает невозможность тестирования. В будущем, безусловно, возникнут проблемы с интеграцией. (имена изменены, чтобы защитить невинных), получая в течение нескольких недель желаемый функционал для этой итерации библиотеки... любая помощь может быть полезной. Сделал бы это на Ruby, но клиенту нужен Python для обучения,
1 ответ
Структурируйте свой код так:
project
-model
__init__.py
my_file.py
-tests
__init__.py
test_my_file.py
Главное, твой tests
каталог также должен быть каталогом модуля (иметь пустой __init__.py
файл в нем).
Тогда в test_my_file.py используйте from model import my_file
и из верхнего каталога запустить python -m tests.test_my_file
, Это вызывает test_my_file
как модуль, в результате чего Python устанавливает свой путь импорта, чтобы включить ваш верхний уровень.
Еще лучше, вы можете использовать pytest или нос, и работает py.test
подберет тесты автоматически.
Я понимаю, что это не отвечает на ваш вопрос, но вам будет гораздо легче работать со стандартными практиками Python, а не против них. Это означает структурирование вашего проекта с помощью тестов в их собственном каталоге верхнего уровня.