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