我试图弄清楚如何以编程方式执行包含相对导入的模块。
伪代码
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 模块?如果是这样,怎么办?
你的代码对我来说效果很好。
一个可能的问题是您正在使用的价值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)
Run Code Online (Sandbox Code Playgroud)
# empty
Run Code Online (Sandbox Code Playgroud)
from . import otherinside
print('I got', otherinside.data)
Run Code Online (Sandbox Code Playgroud)
data = 'other inside'
Run Code Online (Sandbox Code Playgroud)
现在,python3 runimport.py
打印“我里面还有其他东西”。如果您将名称替换为“inside”,则会引发您所描述的错误。
归档时间: |
|
查看次数: |
2977 次 |
最近记录: |