Как создать загрузчик расширений в Python? - PullRequest
1 голос
/ 24 января 2012

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

Вероятно, такие свойства, как: только модули, которые содержат определенное значение (например, тег) в некотором поле метаданных, или, возможно, только модули, которые содержат класс, производный от определенного базового класса.

Например, предположим, что расширения являются подключаемыми модулями, которые поддерживают различные типы аутентификации - я хотел бы, чтобы моя инфраструктура обнаружила возможные подключаемые модули во время выполнения, не требуя явной настройки.

Кажется, что подобная «загрузка расширений» должна быть возможной, и, вероятно, она делалась миллион раз раньше, ни один из поисковых запросов, которые пытались попробовать, ничего не приводил, и я не знаю, хороший конкретный проект, который уже реализует это, чтобы начать с чтения чужого подхода.

Любые указатели на подходы, которые будут работать для создания такой вещи (или даже советы о более Pythonic способе думать об этой проблеме) были бы хорошими.

1 Ответ

2 голосов
/ 24 января 2012

(A хороший ответ для этого даст обзор и варианты, поэтому не спешите принимать мой быстрый ответ.)

Я делаю это с одним из моих проектов для загрузкиКлассы всех модулей в пакете без использования import * и жестких кодов имен.Код можно просмотреть в контексте Google Code .

SPECIES = []
'''An automatically generated list of the available species types.'''

def _do_import():
    '''Automatically populates SPECIES with all the modules in this
    folder.

    :Note:
        Written as a function to prevent local variables from being
        imported.
    '''
    import os

    for _, _, files in os.walk(__path__[0]):
        for filename in (file for file in files if file[0] != '_' and file[-3:] == '.py'):
            modname = filename[:filename.find('.')]
            mod = __import__(modname, globals(), fromlist=[])
            for cls in (getattr(mod, s) for s in dir(mod)):
                if cls is not Species and type(cls) is type and issubclass(cls, Species):
                    if getattr(cls, '_include_automatically', True):
                        SPECIES.append(cls)
                        globals()[cls.__name__] = cls

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