【问题标题】:Python: Importing arbitrarily named source files using importlibPython:使用 importlib 导入任意命名的源文件
【发布时间】:2018-07-28 21:10:19
【问题描述】:

在给定绝对文件名的情况下,我使用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:不推荐使用 imp 模块以支持 importlib;请参阅模块的文档以了解其他用途

因此,我正在寻找 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)

当文件名没有扩展名时,这不起作用,就像我的例子一样。我猜它失败了,因为没有一个已实现的“查找器”将该文件识别为 Python 源文件。但是,我并不真正需要这些查找器提供的所有复杂机制,因为我已经确定文件的绝对路径。我只是想把它导入。

一个简单的技巧就是将源代码作为文本读取并在其自己的命名空间中手动执行,类似于

my_module = {} 
exec(open('/paht/to/my_module').read(), my_module)

(有了这个,my_module 中定义的名称可以通过my_module['name'] 而不是my_module.name 获得,但你明白了)。我想知道正确的做法,使用importlib

【问题讨论】:

标签: python python-3.x python-importlib python-3.7 imp


【解决方案1】:

类似问题的解决方案已发布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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2014-11-07
    • 2012-09-22
    • 2019-10-30
    相关资源
    最近更新 更多