使用importlib动态导入包含相对导入的模块

时间:2018-06-16 00:31:35

标签: python python-3.x

我试图弄清楚如何以编程方式执行包含相对导入的模块。

伪造的代码

spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)

其中name是类,path是.py

的绝对路径

当正在加载的模块包含相对导入时,对exec_module的调用会引发以下异常:

尝试相对导入而没有已知的父包

有没有办法以编程方式执行一个本身包含相对导入的python模块?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

您的代码可以正常使用。

一个可能的问题是您使用的name的价值是什么。为了使相对导入起作用,您需要完全指定模块名称(例如name = "package1.package2.mymodule")。

例如:

runimport.py

import importlib
import os

name = "testpack.inside" # NOT "inside"

spec = importlib.util.spec_from_file_location(name, 
    os.path.join(os.path.dirname(__file__), 'testpack/inside.py'))
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)

testpack /的初始化的.py

# empty

testpack / inside.py

from . import otherinside
print('I got', otherinside.data)

testpack / otherinside.py

data = 'other inside'

现在,python3 runimport.py打印出“我有其他内部”。如果用“inside”替换名称,则会抛出您描述的错误。