importlib中imp.find_module的等价物是什么

Mar*_*arc 22 python python-3.x

我的一些代码使用现已弃用的imp包来查找模块

toolboxFile, toolboxPath, toolboxDescription = imp.find_module("Tools")
Run Code Online (Sandbox Code Playgroud)

使用包importlib获得相同结果的等效函数或代码是什么?

Wrz*_*mft 9

相同文件夹

如果模块在您的工作目录中,importlib.util.find_spec可能就足够了.

例如,如果您只想加载模块,可以使用:

  • 在Python 3.5及更高版本中弃用:

    toolbox_specs = importlib.util.find_spec("Tools")
    toolbox = toolbox_specs.loader.load_module()
    
    Run Code Online (Sandbox Code Playgroud)
  • 在Python 3.5及更高版本中引入:

    toolbox_specs = importlib.util.find_spec("Tools")
    toolbox = importlib.util.module_from_spec(toolbox_specs)
    toolbox_specs.loader.exec_module(toolbox)
    
    Run Code Online (Sandbox Code Playgroud)

    警告:我没有对此进行测试,但它直接来自文档,因此我认为它有效.

您可以使用该toolbox_specs对象评估其他几个属性.但是,例如,相应的文件对象不在其中.如果你真的需要在Python 3中使用它,你可能必须获取文件的路径并用其他方法打开它.

不同文件夹

要在不同的文件夹中查找模块,您必须使用a FileFinder,而a 又需要知道模块的类型.例如,如果您的模块是扩展名,则可以按如下方式查找规范:

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

toolsfinder = importlib.machinery.FileFinder("Folder_of_Tools", loader_details)
toolbox_specs = toolsfinder.find_spec("Tools")
Run Code Online (Sandbox Code Playgroud)

然后,您可以toolbox_specs按上述方法进行处理.


Mar*_*son 9

我发现这可以替代 imp.find_module()

importlib.machinery.PathFinder().find_spec(modName, modDirList)
Run Code Online (Sandbox Code Playgroud)

  • modDirList 提供了什么? (2认同)