Импорт родительского каталога для кратких тестов

Я искал этот сайт сверху вниз, но так и не нашел ни одного способа действительно выполнить то, что я хочу в 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, а не против них. Это означает структурирование вашего проекта с помощью тестов в их собственном каталоге верхнего уровня.

Другие вопросы по тегам