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.

Другие вопросы по тегам