我的一些代码使用现已弃用的 imp 包来查找模块
toolboxFile, toolboxPath, toolboxDescription = imp.find_module("Tools")
使用包 importlib 获得相同结果的等效函数或代码是什么?
答案 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")