ImportError: Модуль не назван - Python - PullRequest
64 голосов
/ 28 сентября 2011

У меня есть приложение на 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

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

Ответы [ 6 ]

76 голосов
/ 28 сентября 2011

Ваша модификация 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.

6 голосов
/ 28 сентября 2011

Чтобы импорт модуля 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

5 голосов
/ 28 сентября 2011
from ..gen_py.lib import MyService

или

from main.gen_py.lib import MyService

Убедитесь, что у вас есть (хотя бы пустой) __init__.py файл в каждом каталоге.

3 голосов
/ 09 октября 2015

Это если вы создаете пакет и обнаруживаете ошибку в импорте.Я научился этому нелегко. Ответ не в том, чтобы добавить пакет в путь к Python или сделать это программно (что, если ваш модуль будет установлен, а ваша команда добавит его снова?), Это плохой путь.

Правильно сделать следующее: 1) Использовать virtualenv pyvenv-3.4 или что-то подобное 2) Активировать режим разработки - $ python setup.py develop

3 голосов
/ 22 июля 2014

обязательно включите __init__.py, что дает Python знать, что эти каталоги содержат пакеты

0 голосов
/ 08 мая 2018

Убедитесь, что корневой каталог проекта появляется в выводе sys.path. Если нет, добавьте путь к корневому каталогу проекта в sys.path.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...