Рубрики
Без рубрики

ImportLib – механизм импорта Python

Автор оригинала: Doug Hellmann.

Цель:

Модуль ImportLib подвергает реализацию Python’s Импорт оператора.

Модуль ImportLib включает в себя функции, которые реализуют механизм импорта Python для загрузки кода в пакетах и модулях. Это одна точка доступа к импортированию модулей динамически и полезно в некоторых случаях, когда имя модуля, которое необходимо импортировать, неизвестен, когда код написан (например, для

Пример пакет

Примеры в этом разделе используют пакет под названием Пример с __ in init __. Py .

Пример/__ init__.py

print('Importing example package')

Пакет также содержит DEMADULE.PY .

Пример/proplodule.py.

print('Importing submodule')

Следите за текстом из Print () вызовов в выходе образца, когда пакет или модуль импортируются.

Типы модулей

Python поддерживает несколько стилей модулей. Каждый требует собственного обращения при открытии модуля и добавление его в пространство имен, а поддержка форматов варьируется на платформе. Например, в разделе Microsoft Windows общие библиотеки загружаются из файлов с расширениями <код> .dll или <код> .pyd , вместо <кода> .so . Расширения модулей C могут также изменяться при использовании отладочной сборки интерпретатора вместо нормального сборки высвобождения, поскольку они могут быть скомпилированы с включенными в комплектую информацию о отладке. Если библиотека расширения C или другой модуль не загружается, как ожидалось, используйте константы, определенные в ImportLib.machinery , чтобы найти поддерживаемые типы для текущей платформы, а также параметры для их загрузки.

importlib_suffixes.py

import importlib.machinery

SUFFIXES  [
    ('Source:', importlib.machinery.SOURCE_SUFFIXES),
    ('Debug:',
     importlib.machinery.DEBUG_BYTECODE_SUFFIXES),
    ('Optimized:',
     importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES),
    ('Bytecode:', importlib.machinery.BYTECODE_SUFFIXES),
    ('Extension:', importlib.machinery.EXTENSION_SUFFIXES),
]


def main():
    tmpl  '{:<10}  {}'
    for name, value in SUFFIXES:
        print(tmpl.format(name, value))


if __name__  '__main__':
    main()

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

$ python3 importlib_suffixes.py

Source:     ['.py']
Debug:      ['.pyc']
Optimized:  ['.pyc']
Bytecode:   ['.pyc']
Extension:  ['.cpython-37m-darwin.so', '.abi3.so', '.so']

Импорт модулей

API высокого уровня в ImportLib позволяет импортировать модуль, данный абсолютное или относительное имя. При использовании относительного имени модуля укажите пакет, содержащий модуль как отдельный аргумент.

importlib_import_module.py

import importlib


m1  importlib.import_module('example.submodule')
print(m1)

m2  importlib.import_module('.submodule', package'example')
print(m2)

print(m1 is m2)

Возвращаемое значение из Import_module () – это объект модуля, который был создан импортным.

$ python3 importlib_import_module.py

Importing example package
Importing submodule


True

Если модуль не может быть импортирован, <код> Import_Module () поднимает <код> ImportError .

importlib_import_module_error.py

import importlib


try:
    importlib.import_module('example.nosuchmodule')
except ImportError as err:
    print('Error:', err)

Сообщение об ошибке включает в себя имя отсутствующего модуля.

$ python3 importlib_import_module_error.py

Importing example package
Error: No module named 'example.nosuchmodule'

Перезагрузить существующий модуль, используйте RELOOD () .

importlib_reload.py

import importlib


m1  importlib.import_module('example.submodule')
print(m1)

m2  importlib.reload(m1)
print(m1 is m2)

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

$ python3 importlib_reload.py

Importing example package
Importing submodule

Importing submodule
True

Погрузчики

API нижнего уровня в ImportLib.UTIL обеспечивает доступ к объектам загрузчика, как описано в модулях и импортировании из раздела в модуле SYS . Чтобы получить информацию, необходимую для загрузки модуля для модуля, используйте FACH_SPEC () , чтобы найти «SPECT IMPORTE SPEC». Затем, чтобы получить модуль, используйте Load_Module () .

importlib_find_loader.py

import importlib

spec  importlib.util.find_spec('example')
print('Loader:', spec.loader)

m  spec.loader.load_module()
print('Module:', m)

В этом примере нагружается верхний уровень на примера <код> .

$ python3 importlib_find_loader.py

Loader: <_frozen_importlib_external.SourceFileLoader object at
0x104d31208>
Importing example package
Module: 

Подмодули внутри пакетов должны быть загружены отдельно, используя путь от пакета. В следующем примере пример Package передается <код> find_spec () для создания погрузчика, способного загружать подмодулю.

importlib_submodule.py

import importlib

spec  importlib.util.find_spec('.submodule', package'example')
print('Loader:', spec.loader)

m  spec.loader.load_module()
print('Module:', m)

Как и в случае с Import_Module () , имя подмодуля должно быть дано с префиксом относительного пути.

$ python3 importlib_submodule.py

Importing example package
Loader: <_frozen_importlib_external.SourceFileLoader object at
0x108b465f8>
Importing submodule
Module: 

Смотрите также

  • Python 2-3 Портирование ноты для ImportLib