Несколько импортов одного и того же имени файла - PullRequest
0 голосов
/ 22 декабря 2010

Я пытаюсь создать систему плагинов, и у меня есть функция, которая импортирует все модули в массив.

Расположение плагинов:

pluginsDir /

pluginsDir / чат

pluginsDir / чат / main.py

И это функция, которая находит и импортирует плагины:

if os.path.exists(pluginsDir):
    for path, dirArray, fileArray in os.walk(pluginsDir):
        for fileName in fileArray:
            if fileName == "main.py":
            sys.path.append(path)
            try:
                plugins.append(__import__("main"))
            except:
                print 'Could not import plugin, "'+path+'": plugin contains errors or is not a real plugin.'

Это нормально, если у меня только один плагин, но когда у меня несколько плагинов, он продолжает импортировать первый обнаруженный плагин.

Расположение плагинов:

pluginsDir /

pluginsDir / чат

pluginsDir / чат / main.py

pluginsDir / сборка

pluginsDir / сборка / main.py

Я пытался добавить sys.path.remove(path) после моего оператора try, но он не удаляет путь после того, как я уже импортировал модуль.

Что я могу сделать, чтобы правильно импортировать мои плагины?

Ответы [ 3 ]

4 голосов
/ 22 декабря 2010

sys.path.append(path) прикрепит папку плагина к end из sys.path.Поскольку Python ищет папки в sys.path спереди назад, добавление дополнительных путей в конец списка не будет найдено, потому что любые модули main.py в папке, указанной ранее в sys.path, по существу будут скрывать модули в папках в концесписок.Вместо этого вы можете использовать sys.path.insert(0, path) для добавления новых путей в начало списка.

Вам следует взглянуть на Пакеты Python , чтобы лучше структурировать плагины.1013 *

С пакетами Python цикл в вашем скрипте может быть легко реализован с помощью:

sys.path.insert(0, path_to_plugindir)
for folder in dirArray:
    __import__(folder)
2 голосов
/ 22 декабря 2010

Система модулей Python - это очень крутой способ обработки пространств имен. Импорт нескольких модулей с одинаковыми именами в ваше текущее пространство имен приведет к его загромождению.

Нет необходимости проходить через pluginsDir и импортировать каждый файл, Python сделает это за вас (из импорта pluginsDir *). Если main.py выполняет только инициализацию, вы можете переместить код в pluginsDir/chat/__init__.py.

Импорт pluginsDir, ссылающийся на ваши плагины, например 'pluginsDir.chat', считается лучшей практикой.

0 голосов
/ 22 декабря 2010

Ваш внутренний цикл for не имеет отступов, я не понимаю, почему ваш код работает вообще. Исправление отступа может решить проблему.

...