Python: 使用 importlib 导入任意命名的源文件
Python: Importing arbitrarily named source files using importlib
我使用 imp
模块从源代码导入 Python 模块,给定绝对文件名。即
import imp
my_module = imp.load_source('my_module', '/paht/to/my_module')
此处,/paht/to/my_module
是包含 Python 源代码的文件的完整路径,即使它没有 .py
扩展名。
在 Python 3.7 中执行 import imp
时,显示以下弃用警告:
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
因此,我正在寻找 importlib
替代 imp.load_source
功能。从 docs,我有以下内容:
import importlib.util
spec = importlib.util.spec_from_file_location('my_module', '/paht/to/my_module')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
当文件名没有扩展名时,这不起作用,就像我的情况一样。我猜它失败了,因为实现的 "finders" 的 none 将该文件识别为 Python 源文件。然而,我并不真的需要这些查找器提供的所有复杂机制,因为我已经确定文件的绝对路径。我只想导入它。
一个简单的 hack 就是将源代码作为文本读取并在其自己的命名空间中手动执行,例如
my_module = {}
exec(open('/paht/to/my_module').read(), my_module)
(有了这个,在 my_module
中定义的名称可以通过 my_module['name']
而不是 my_module.name
获得,但你明白了)。我想知道使用 importlib
.
的正确方法
已发布类似问题的解决方案 here。翻译成我的例子:
import importlib.machinery, importlib.util
loader = importlib.machinery.SourceFileLoader('my_module', '/path/to/my_module')
spec = importlib.util.spec_from_loader(loader.name, loader)
my_module = importlib.util.module_from_spec(spec)
loader.exec_module(my_module)
我使用 imp
模块从源代码导入 Python 模块,给定绝对文件名。即
import imp
my_module = imp.load_source('my_module', '/paht/to/my_module')
此处,/paht/to/my_module
是包含 Python 源代码的文件的完整路径,即使它没有 .py
扩展名。
在 Python 3.7 中执行 import imp
时,显示以下弃用警告:
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
因此,我正在寻找 importlib
替代 imp.load_source
功能。从 docs,我有以下内容:
import importlib.util
spec = importlib.util.spec_from_file_location('my_module', '/paht/to/my_module')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
当文件名没有扩展名时,这不起作用,就像我的情况一样。我猜它失败了,因为实现的 "finders" 的 none 将该文件识别为 Python 源文件。然而,我并不真的需要这些查找器提供的所有复杂机制,因为我已经确定文件的绝对路径。我只想导入它。
一个简单的 hack 就是将源代码作为文本读取并在其自己的命名空间中手动执行,例如
my_module = {}
exec(open('/paht/to/my_module').read(), my_module)
(有了这个,在 my_module
中定义的名称可以通过 my_module['name']
而不是 my_module.name
获得,但你明白了)。我想知道使用 importlib
.
已发布类似问题的解决方案 here。翻译成我的例子:
import importlib.machinery, importlib.util
loader = importlib.machinery.SourceFileLoader('my_module', '/path/to/my_module')
spec = importlib.util.spec_from_loader(loader.name, loader)
my_module = importlib.util.module_from_spec(spec)
loader.exec_module(my_module)