Задержка загрузки модулей в python - PullRequest
5 голосов
/ 30 октября 2010

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

Каждый драйвер представлен отдельным модулем Python в пакете, который является моей программой. Каждый из них реализует некоторый стандартный интерфейс, но в основном это гигантский список команд (и отображений функций), специфичных для каждого устройства и шины. В долгосрочной перспективе (я пишу это для своей лабораторной группы и планирую поддерживать несколько десятков или около того устройств), я хочу не загружать их все сразу. Вместо этого во время выполнения я хочу прочитать список модулей в словаре / списке, а затем загружать их только тогда, когда они действительно необходимы.

Когда пользователь хочет использовать новое устройство, он выбирает драйвер для использования и передает имя подсистеме драйверов, которая затем проверяет, есть ли этот драйвер в списке загруженных модулей, и если это не так, он вызывает функцию __import__ и загружает драйвер, затем создает экземпляр объекта устройства с помощью драйвера и передает его пользователю для использования.

Мой вопрос: каков наилучший способ получить список всех модулей относительным способом? Что я имею в виду, если я знаю, что драйверы находятся в ..drivers, есть ли способ получить аккуратный список модулей в этом подпакете? Для иллюстрации: обычно я просто вызываю from ..drivers import driver_name для импорта модуля, но поскольку я не гарантирую, что в каталоге пакета, мы не можем просто использовать os, чтобы получить список имен модулей .

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

Ответы [ 3 ]

3 голосов
/ 30 октября 2010

Если местоположение пакетов драйверов известно, то вы можете использовать абсолютный путь к папке (папкам) драйверов.

Я думаю, что более надежный подход - это иметь список всех известныхдрайверы для вашей программы, возможно, вместе с небольшим количеством метаданных, чтобы пользователи могли выбирать их проще.Вы можете попросить водителей зарегистрировать себя или зарегистрировать их самостоятельно, если вы знаете вероятные места.Одним из преимуществ регистрации драйверов является то, что у вас могут быть файлы python, отличные от драйверов, в каталогах пакетов драйверов.

Редактировать

Для драйвера "зарегистрировать себя", «вы могли бы сделать что-то вроде этого:

if __name__ == "__main__":
    import mamapackage
    mamapackage.register("thisdriver", 
               os.path.abspath(__file__), 
               "A description of this driver")

Затем в вашем собственном пакете предоставьте функцию« регистрация », которая обновляет список драйверов с их расположением и описаниями (простой текстовый файл должен делать длястартеры).

3 голосов
/ 30 октября 2010

Существует pkgutil, который имеет iter_modules.(Примечание: В документации по Python 2 эта функция не упоминается, но она отлично работает для меня на Python 2.6.)

Вы также можете сделать это вручную, используя __file__, os.path и os.listdir.

0 голосов
/ 30 октября 2010

Почему бы не сделать пакет из всех драйверов? Тогда вы могли бы

import drivers
drivers.load("device1")

где функция load поддерживает отображение имени устройства на модуль в пакете? Затем вы можете динамически импортировать каждый из необходимых модулей при необходимости ...

...