python-importlib - 如何强制 importlib find_loader 仅使用特定路径?

标签 python-importlib

我正在尝试基于 imp 模块重新实现一些代码以使用 importlib 代替。函数 imp.find_moduleimportlib.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/

相关文章:

python - 从 django.utils.importlib 导入 import_module 导入错误 : No module named importlib

python - 来自字符串中定义的函数的 `inspect.getsource`? `s="def f() : return 5 "`

Python:从名称为变量的文件导入函数

python - 如何在 flask Controller 中正确使用 importlib?

python - python3中的importlib.util是什么?

python - 如何使用importlib打开包中的文件?

python - 使用 import_module 从不同目录导入模块

python - 使用 module_from_spec 加载的 python 类中缺少源信息

python - 在 IPython 中使用 importlib 重新加载模块

Python:如何使用 Importlib 创建类对象