Подтвердить что ты не робот

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

Что мне здесь не хватает?

4b9b3361

Ответ 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.