我正在尝试基于 imp
模块重新实现一些代码以使用 importlib
代替。函数 imp.find_module
和 importlib.find_loader
之间存在细微差别:
# Using imp find_module
>>> import imp
>>> imp.find_module("abc", ["some/path/module.py"])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.3/imp.py", line 220, in find_module
raise ImportError(_bootstrap._ERR_MSG.format(name), name=name)
ImportError: No module named 'abc'
# Using import find_loader
>>> import importlib
>>> loader = importlib.find_loader("abc", ["some/path/module.py"])
>>> loader.path
'/usr/lib64/python3.3/abc.py'
看起来importlib
正在回退到系统库,而imp.find_module
正在以独占方式使用path
参数,这最终引发异常。
如何强制importlib.find_loader
仅使用特定路径?
最佳答案
这取决于您的代码的确切目标。首先,这两个调用都是错误的,因为“path”参数是目录列表,而不是特定文件。
其次,abc 是从标准库返回的,因为它已经在 sys.modules 中。请记住, importlib.find_loader() 查找指定模块的加载程序,因此包括查找 sys.modules['abc'].__loader__ 以避免不必要地尝试查找它。如果您在标准库中指定了一个尚未导入的模块(例如 tokenize),则 importlib.find_loader() 将返回 None。
换句话说,当在“path”中指定时,importlib.find_loader() 将在特定目录中搜索模块,但您必须查找尚未导入的内容。
关于python-importlib - 如何强制 importlib find_loader 仅使用特定路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15622875/