При автоматическом импорте модулей из подпапки их импорт не выполняется - PullRequest
1 голос
/ 13 февраля 2011

Я прочитал пару похожих вопросов, в частности , этот вопрос о 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. Что вызывает это?

1 Ответ

0 голосов
/ 13 февраля 2011

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

from .utils import http

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

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

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

...