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

2024-10-03 15:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

EDOPSU代码

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_模块的调用将引发以下异常:

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

有没有一种方法可以编程地执行本身包含相对导入的python模块?如果是,怎么办?在


Tags: 模块path代码namefrommod编程util
1条回答
网友
1楼 · 发布于 2024-10-03 15:27:29

你的代码对我来说很好。在

一个可能的问题是您使用的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)

测试包/init.py

^{pr2}$

测试包/内部.py

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

测试包/其他内部.py

data = 'other inside'

现在,python3 runimport.py打印“我有其他人在里面”。如果您将名称替换为“inside”,它将抛出您描述的错误。在

相关问题 更多 >