如何使用importlib替代已弃用的imp模块并保留原有运行行为?
问题核心原因
原imp.load_source的第一个参数传入的是__main__,会将加载的模块的__name__属性设为__main__,才能触发test.py里的主逻辑分支。你当前的importlib实现存在两个问题:
- 模块名传入的是脚本文件名而非
__main__,导致if __name__ == "__main__"判断不成立 - 代码中使用了
sys.modules但未导入sys模块,会触发NameError
修正后的完整代码
import importlib import os import site import sys # 补全缺失的sys导入 script = os.path.abspath(r"./test.py") script_dir = os.path.dirname(script) site.addsitedir(script_dir) # 第一个参数传入__main__,和原imp实现逻辑一致 spec = importlib.util.spec_from_file_location('__main__', script) module = importlib.util.module_from_spec(spec) # 模块名也要对应改为__main__存入sys.modules sys.modules['__main__'] = module spec.loader.exec_module(module)
调整说明
- 把
spec_from_file_location的第一个参数从脚本名改为__main__,和原imp.load_source的第一个参数完全对应,保证加载的模块__name__属性符合预期 - 补全
import sys导入,修复sys.modules调用的报错 - 将
sys.modules的键改为__main__,和模块名保持一致
运行后就会输出和原imp版本完全一致的结果:
__main__ main()
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

