Импорт папки модулей в Python - PullRequest
2 голосов
/ 21 октября 2011

Возможно ли в python получить список модулей из папки / пакета и импортировать их?

Я хотел бы иметь возможность делать это из функции внутри класса, чтобы весь класс имел к ним доступ (возможно, из метода __init__).

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 21 октября 2011

См. Документ модулей .

Единственное решение для автора пакета - предоставить явное Индекс пакета. Оператор импорта использует следующее соглашение: если код пакета __init__.py определяет список с именем __all__, это список имен модулей, которые должны быть импортированы при обнаружении импорта из пакета *. Это до автор пакета, чтобы поддерживать этот список в актуальном состоянии, когда новая версия пакет выпущен. Авторы пакетов также могут принять решение не поддерживать это, если они не видят использования для импорта * из своего пакета. За Например, файл звуков / эффектов / __init__.py может содержать следующий код:

__all__ = ["echo", "surround", "reverse"]

Это будет означать, что из sound.effects import * будет импортировать три именованных подмодуля пакета звука.

Да, вы можете найти способ сделать это, выполнив распечатку каталога для файлов в каталоге и импортировав их вручную. Но нет встроенного синтаксиса для того, что вы просите.

0 голосов
/ 21 октября 2011

Модуль distribute предоставляет механизм, который выполняет большую часть этого.Во-первых, вы можете начать с перечисления файлов python в пакете, используя pkg_resources.resource_listdir:

>>> module_names = set(os.path.splitext(r)[0] 
...     for r
...     in pkg_resources.resource_listdir("sqlalchemy", "/")
...     if os.path.splitext(r)[1] in ('.py', '.pyc', '.pyo', '')
...     ) - set(('__init__',))
>>> module_names
set(['engine', 'util', 'exc', 'pool', 'processors', 'interfaces', 
'databases', 'ext', 'topological', 'queue', 'test', 'connectors',
'orm', 'log', 'dialects', 'sql', 'types',  'schema'])

Затем вы можете импортировать каждый модуль в цикле:

modules = {}
for module in module_names:
    modules[module] = __import__('.'.join('sqlalchemy', module))
0 голосов
/ 21 октября 2011

Вы можете узнать список модулей с функцией dir

import module
dir (module)

Позже в программе вы можете импортировать одну функцию:

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