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

J.D*_*bin 7 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)
Run Code Online (Sandbox Code Playgroud)

其中 name 是类,path 是 .py 的绝对路径

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

尝试在没有已知父包的情况下进行相对导入

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

Str*_*ids 6

你的代码对我来说效果很好。

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

例如:

运行导入.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)
Run Code Online (Sandbox Code Playgroud)

测试包/初始化.py

# empty
Run Code Online (Sandbox Code Playgroud)

测试包/inside.py

from . import otherinside
print('I got', otherinside.data)
Run Code Online (Sandbox Code Playgroud)

测试包/otherinside.py

data = 'other inside'
Run Code Online (Sandbox Code Playgroud)

现在,python3 runimport.py打印“我里面还有其他东西”。如果您将名称替换为“inside”,则会引发您所描述的错误。