Преимущество добавления пути к sys.path (по сравнению с использованием imp) заключается в том, что это упрощает процесс импорта более одного модуля из одного пакета. Например:
import sys # the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py sys.path.append('/foo/bar/mock-0.3.1')
from testcase import TestCase from testutils import RunTests from mock import Mock, sentinel, patch
Ответ 3
Чтобы импортировать ваш модуль, вам нужно добавить его каталог в переменную среды, временно или постоянно.
Если ваш модуль верхнего уровня не является файлом, а упакован в виде каталога с __init__.py , то принятое решение почти работает, но не совсем. В Python 3.5+ необходим следующий код (обратите внимание на добавленную строку, начинающуюся с 'sys.modules'):
Без этой строки, когда выполняется exec_module, он пытается привязать относительный импорт на вашем верхнем уровне __init__.py к имени модуля верхнего уровня - в данном случае "mymodule". Но "mymodule" еще не загружен, поэтому вы получите сообщение об ошибке "SystemError: родительский модуль "mymodule" не загружен, не удается выполнить относительный импорт". Итак, вам нужно привязать имя перед его загрузкой. Причиной этого является фундаментальный инвариант относительной системы импорта: "Неизменным является то, что если у вас есть sys.modules['spam'] и sys.modules['spam.foo'] (как было бы после вышеупомянутого импорта), последний должен отображаться как атрибут foo первого" как обсуждалось здесь .