ImportError: Модуль не назван - Python
У меня есть приложение на Python со следующей структурой каталогов:
src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib
В основном пакете у меня есть модуль python с именем MyServer.py, который имеет оператор импорта, например:
from gen_py.lib import MyService
Чтобы этот оператор работал, я поместил следующую строку в начало MyServer.py:
import sys
sys.path.append('../gen_py/lib')
Когда я запускаю MyServer.py в терминале, я получаю следующую ошибку:
ImportError: нет модуля с именем gen_py.lib
Что мне здесь не хватает?
6 ответов
Ваша модификация sys.path
предполагает, что текущий рабочий каталог всегда находится в main/
, Это не вариант. Вместо этого просто добавьте родительский каталог в sys.path
:
import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib
Не забудьте включить файл __init__.py
в gen_py и lib - в противном случае они не будут распознаваться как модули Python.
Чтобы импорт модуля Python работал, в вашем пути должен быть указан "src", а не "gen_py/lib".
При обработке импорта, как import gen_py.lib
он ищет модуль gen_py
затем ищет подмодуль lib
,
Как модуль gen_py
не будет в "../gen_py/lib" (это будет в ".."), добавленный вами путь ничего не изменит для процесса импорта.
В зависимости от того, откуда вы его запускаете, попробуйте добавить относительный путь к папке "src". Возможно это sys.path.append('..')
, Вы также можете успешно запустить скрипт, находясь в папке src напрямую, через относительные пути, такие как python main/MyServer.py
from ..gen_py.lib import MyService
или же
from main.gen_py.lib import MyService
Убедитесь, что у вас есть (хотя бы пустой) __init__.py
файл в каждом каталоге.
Не забудьте включить __init__.py
, что дает Python знать, что эти каталоги содержат пакеты
Это если вы собираете пакет и обнаруживаете ошибку в импорте. Я научился этому нелегко. Ответ не в том, чтобы добавить пакет в путь к Python или сделать это программно (что, если ваш модуль будет установлен, а ваша команда добавит его снова?), Это плохой путь.
Правильно сделать следующее: 1) Использовать virtualenv pyvenv-3.4 или что-то подобное. 2) Активировать режим разработки - $python setup.py develop
Убедитесь, что корневой каталог проекта появляется в выводе sys.path. Если нет, пожалуйста, добавьте путь к корневому каталогу проекта в sys.path.