我试图弄清楚如何以编程方式执行包含相对导入的模块。
伪造的代码
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模块?如果是这样,怎么样?
答案 0 :(得分:0)
您的代码可以正常使用。
一个可能的问题是您使用的name
的价值是什么。为了使相对导入起作用,您需要完全指定模块名称(例如name = "package1.package2.mymodule"
)。
例如:
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)
# empty
from . import otherinside
print('I got', otherinside.data)
data = 'other inside'
现在,python3 runimport.py
打印出“我有其他内部”。如果用“inside”替换名称,则会抛出您描述的错误。