Автор оригинала: 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 submoduleTrue
Если модуль не может быть импортирован, <код> 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 submoduleImporting 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:
Смотрите также
- Стандартная библиотечная документация для ImportLib
- Модули и импорт – импортные крючки, модуль
- Python 2-3 Портирование ноты для ImportLib