python 脚本在 vs code 调试器中正常运行,但在双击或通过文件资源管理器用 python 直接打开时闪退,根本原因是程序执行完毕后终端自动退出;只需在主逻辑末尾添加阻塞式输入即可保持窗口常驻。
这个问题非常典型:脚本本身没有错误,而是运行环境差异导致的“视觉性崩溃”。VS Code 的调试终端默认会保留窗口(即使程序结束),而 Windows 下直接双击 .py 文件调用 python.exe 启动时,一旦 main() 执行完毕、sys.exit() 触发或主流程自然退出,关联的命令提示符(CMD)窗口就会立即关闭——用户甚至来不及看到最后的输出。
? 根本原因分析
- getpass.getpass() 和 input() 确实会暂停程序,但仅限于它们被调用时;
- 你的 desktop() 函数中使用了 while True: 循环,看似永不退出,但注意:当用户输入非法命令(如 “calculator”)时,代码进入 else 分支并执行 continue,但并未处理合法退出路径;
- 更关键的是:calculator() 和 antivirus() 函数目前为空(仅 pass),调用后立即返回,循环继续,但若用户想退出桌面环境,原代码中没有任何 break 或退出指令;
- 因此,当用户完成所有操作(例如登录 → 进入 desktop → 无意中触发未定义行为或异常退出循环)后,login() 函数返回,main() 执行完毕,进程终止,CMD 窗口瞬间关闭。
✅ 正确解决方案
在 main() 函数末尾添加一行阻塞输入,确保程序不会立即退出:
def main():
welcome_user()
boot_up()
time.sleep(1)
login()
input("Press Enter to exit...") # ? 关键修复:保持窗口打开
⚠️ 注意:这行必须放在 login() 之后、main() 结束前。它不会影响正常逻辑,仅作为“安全垫”捕获最终退出意图。
?️ 同时建议增强健壮性(推荐补充)
除了上述修复,还应完善 desktop() 的退出机制,避免依赖外部 input():