При автоматическом импорте модулей из подпапки их импорт не выполняется

Я прочитал пару похожих вопросов, особенно этот о imp.load_module, что кажется близким к тому, что я хочу, но я не могу понять, почему я все еще получаю ImportErrors. Вот моя иерархия папок:

program\
  __init__.py
  main.py
  thirdparty\
    __init__.py
    css\
      __init__.py
      css.py
      utils\
        __init__.py
        http.py

В main.py у меня есть следующий код. Это предназначено для поиска в каталоге thirdparty\ и загрузки каждого найденного модуля. Каждый модуль находится в своем отдельном каталоге.

import os
import imp

for root, dirs, files in os.walk("thirdparty"):
    for source in (s for s in files if s.endswith(".py")):
        name = os.path.splitext(os.path.basename(source))[0]
        m = imp.load_module(name, *imp.find_module(name, [root]))

Проблема в том, что css.py использует свою собственную подпапку, из которой он загружает данные, utils. В нем есть строчка, в которой говорится:

from utils import http

И вот тут он терпит неудачу. Я получаю эту ошибку, когда запускаю main.py.

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    m = imp.load_module(name, *imp.find_module(name, [root]))
  File "thirdparty/css/css.py", line 1, in <module>
    from utils import http
ImportError: No module named utils

Я в тупике. css.py находится в своей собственной папке, и когда я запускаю css.py отдельно, он отлично импортирует utils. Чем это вызвано?


person Aphex    schedule 13.02.2011    source источник
comment
Я столкнулся с этой же проблемой. Вы когда-нибудь находили ответ? В Python 3 модуль imp устарел в пользу importlib, но я еще не пробовал.   -  person Aron Griffis    schedule 21.06.2012


Ответы (1)


Возможно, вы можете решить эту проблему, изменив импорт на:

from .utils import http

Или добавив папку, которую вы импортируете, в путь Python:

sys.path.append(os.path.join(root, source))

Когда вы импортируете модули в thirdparty, место, где Python ищет модули, по-прежнему остается главным каталогом. Первоначальный импорт работает, потому что вы указываете правильный путь к imp.find_module, но после этого Python понятия не имеет, где искать модули.

person Jochen Ritzel    schedule 13.02.2011