You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:03