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

时间:2016-02-09 09:16:00

标签: python python-3.x

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

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

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

3 个答案:

答案 0 :(得分:7)

相同文件夹

如果模块在您的工作目录中,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)
    

    警告:我没有对此进行测试,但它直接来自documentation,所以我认为它有效。

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

不同的文件夹

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

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

答案 1 :(得分:1)

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

importlib.machinery.PathFinder().find_spec(modName, modDirList)

答案 2 :(得分:-2)

根据本页中的Python官方文档imp

find_module自版本3.3后不推荐使用importlib.util.find_spec()代替,除非需要Python 3.3兼容性,在这种情况下使用importlib.find_loader()

使用importlib.util.find_spec("Tools")查找规范可获取更多信息link

使用importlib.find_loader("Tools")查找加载程序more information

修改

示例代码

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")