То, что вы пытаетесь сделать, это относительный импорт. Он отлично работает в Python, , но на уровне модулей, а не на уровне файловой системы. Я знаю, это сбивает с толку.
Это означает, что если вы запускаете скрипт в подкаталоге, он не видит верхние каталоги, потому что для запущенного скрипта корень модуля - это текущий каталог: верхнего модуля нет.
Так для чего нужен относительный импорт?
Хорошо, модуль в поддиректории для импорта автомобилей в верхние каталоги, если они сами импортированы из верхнего каталога.
В вашем случае это означает, что вы должны запускать свои скрипты из "/", чтобы он стал корнем модуля и субмодулям разрешалось использовать относительный импорт.
Возможное решение вашей проблемы - удалить блок if __name__ == "__main__"
и создать /tests.py:
.
import doctest
from model import car
from tools import tool
doctest.testmod(car)
doctest.testmod(tool)
Тогда запустите тоже, запустите все тесты.
В конечном итоге вы захотите автоматизировать процесс, простое решение - использовать unittest, чтобы вы могли создавать наборы тестов и просто добавлять имена модулей, которые вы хотите протестировать:
import unittest
import doctest
modules = ("model.car",
"tools.tool")
suite = unittest.TestSuite()
for mod in modules:
suite.addTest(doctest.DocTestSuite(mod))
runner = unittest.TextTestRunner()
runner.run(suite)
Другое решение (рекомендуется) - использовать инструмент, такой как nose , который автоматизирует это для вас.
easy_install nose
nosetests --with-doctest # done :-)
И, кстати, избегайте from x import *
. Это работает для быстрых сценариев, но когда ваша программа будет расти, вам действительно нужно будет явно указать, что вы импортируете. Либо import x
, либо from x import y