2010-10-30 5 views
5

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

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

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

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

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

ответ

3

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

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

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

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

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

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

+0

Как бы я узнал о том, что водители регистрируются? Реализовать их с помощью небольших скриптов, чтобы найти мое программное обеспечение и зарегистрировать себя? или что-то более умное? – crasic

+0

Спасибо за большое предложение, я реализую простой текстовый файл для хранения имен драйверов и метаданных, возможно, не лучшее долгосрочное решение (когда люди могут захотеть импортировать внешние драйверы), но определенно работает как прелесть на данный момент. – crasic

3

pkgutil имеет iter_modules. (Примечание: The Python 2 documentation не упоминает эту функцию, но она прекрасно работает для меня на Python 2.6.)

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

0

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

import drivers 
drivers.load("device1") 

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

Смежные вопросы