Что эквивалентно imp.find_module в importlib

Некоторые из моего кода используют теперь устаревший пакет imp, чтобы найти модуль

toolboxFile, toolboxPath, toolboxDescription = imp.find_module("Tools")

Что такое эквивалентная функция или код для получения одинаковых результатов с пакетом importlib?

Ответ 1

В той же папке

Если модуль находится в вашем рабочем каталоге, importlib.util.find_spec, вероятно, достаточно для ваших целей.

Например, если вы просто хотите загрузить модуль, вы можете использовать:

  • устарел в Python 3.5 и выше:

    toolbox_specs = importlib.util.find_spec("Tools")
    toolbox = toolbox_specs.loader.load_module()
    
  • , введенный в Python 3.5 и выше:

    toolbox_specs = importlib.util.find_spec("Tools")
    toolbox = importlib.util.module_from_spec(toolbox_specs)
    toolbox_specs.loader.exec_module(toolbox)
    

    Предостережение: я не тестировал это, но его прямо из документации, поэтому я полагаю, что он работает.

Вы можете оценить несколько других свойств с помощью объекта toolbox_specs. Однако, например, соответствующий файл-объект не входит в число них. Если вам действительно нужно это в Python 3, вам, вероятно, придется получить путь к файлам и открыть его другими способами.

Разная папка

Чтобы найти модуль в другой папке, вы должны работать с FileFinder, который, в свою очередь, должен знать модули тип. Например, если ваш модуль является расширением, вы можете найти спецификации следующим образом:

loader_details = (
    importlib.machinery.ExtensionFileLoader,
    importlib.machinery.EXTENSION_SUFFIXES
    )

toolsfinder = importlib.machinery.FileFinder("Folder_of_Tools", loader_details)
toolbox_specs = toolsfinder.find_spec("Tools")

Затем вы можете обработать toolbox_specs, как описано выше.

Ответ 2

В соответствии с официальной документацией Python на этой странице imp

find_module Устаревший с версии 3.3 Используйте importlib.util.find_spec(), если не требуется совместимость с Python 3.3, и в этом случае используйте importlib.find_loader().

Используйте importlib.util.find_spec("Tools") для поиска spec для получения дополнительной информации, вы можете увидеть эту ссылку .

И используйте importlib.find_loader("Tools") для поиска загрузчика больше информации

EDIT:

пример кода

import importlib
import importlib.util
import sys

    name="test"
    moduledir="d:\\dirtest"
# this is optional set that if you what load from specific directory
    try:
        spec = importlib.util.find_spec(name,moduledir)
        if spec is None:
            print("Import error 0: " + " module not found")
            sys.exit(0)
        toolbox = spec.loader.load_module()
    except (ValueError, ImportError) as msg:
        print("Import error 3: "+str(msg))
        sys.exit(0)

    print("load module")