Python如何实现两个导入模块按先后顺序顺次执行
问题核心根源
- 你当前遇到的两类异常现象,本质是Python执行逻辑和GUI框架特性叠加导致的:
- Python的
from 模块名 import *语法会在导入执行的瞬间,跑完全部目标模块顶层的代码,你写的导入顺序虽然是先跑Game的main再导入Typing模块,但Game模块的main()函数通常会启动GUI类程序的阻塞式事件循环,只要这个循环还在跑,主线程就会卡在当前行,根本走不到后面的导入语句。 - 你看到“手动关Game窗口才加载Typing模块”,是因为手动关窗口时,GUI框架会捕获关闭事件,跳出阻塞的事件循环,主线程得以继续往下执行导入Typing模块的逻辑;而“Game流程正常结束时Typing模块不触发”,是因为你在Game模块的内部流程里,大概率写了直接终止整个进程的逻辑(比如调用
sys.exit()、直接销毁进程),根本没机会执行到后续的代码行。
- Python的
可直接落地的调整方案
- 把跨模块的导入时机,放到上一个流程完全跑完之后,不要提前加载后续要运行的模块
- 保证Game模块的
main()函数在流程结束后自然返回,不要在模块内部直接强制终止整个进程 - 调整后的代码参考:
# 先导入Game模块的入口,不提前加载后续模块 from Game import main as game_entry # 等Game的全部流程执行完、函数返回后,再往下走 game_entry() # 走到这里说明Game已经正常结束,再加载并运行Typing模块 from Typing_Question_Screen import main as typing_entry typing_entry()
常见踩坑提醒
- 检查Game模块内部的退出逻辑:如果是tkinter、pygame这类GUI程序,不要在窗口关闭回调里直接写
exit()、sys.exit(),只需要销毁当前窗口、跳出主事件循环,让main()函数自然执行完返回即可 - 不要在Game文件的顶层提前导入Typing_Question_Screen模块,否则会在Game启动的瞬间就加载Typing模块的全部代码,违背顺次运行的需求
- 如果你用的GUI框架的事件循环是常驻阻塞的,可以在Game流程的退出回调里,设置标记位让主循环正常break,而不是直接终止整个进程
内容的提问来源于stack exchange,提问作者Davina
相关产品推荐
相关产品推荐

