Python脚本在Visual Studio 2022外运行闪退,VS内正常求助
问题原因与解决办法
核心闪退原因
keyboard库权限不足:该库监听键盘需要管理员权限,VS2022默认以管理员身份启动,所以能正常运行;而外部CMD/终端如果不是管理员权限,调用keyboard.is_pressed()会直接抛出异常导致闪退。- 函数调用顺序错误:主循环中调用
options()时,该函数定义在主循环之后,触发NameError异常,外部运行时直接崩溃退出。 - 无异常捕获与退出暂停:脚本遇到错误时直接终止,没有任何提示就关闭窗口,无法排查问题。
分步解决
- 以管理员身份运行终端:右键CMD/PowerShell,选择「以管理员身份运行」,再执行
python your_script.py。 - 调整函数定义顺序:把
options()、comConf()、lockedConf()这些函数移到主循环之前,确保调用时函数已定义。 - 添加异常捕获与退出暂停:在脚本中加入异常捕获,打印错误信息,并用
input()暂停窗口,方便查看问题。 - 可选:替换
keyboard库:如果不想用管理员权限,可以改用pynput库,它不需要管理员权限就能监听键盘输入。
修正后的完整代码
from turtle import clearscreen import keyboard import time import os import colorconsole import sys # 提前定义所有函数,避免调用时未定义 def comConf(): print("input desired COM-port and press enter") comDesire = input() def lockedConf(): passwordInput = input("password:") if passwordInput == "supersecretpassword": print("welcome admin person") def options(): i2 = 0 def optionsMenue(): if i2 == 0: print(" >", end="") print("back") if i2 == 1: print(" >", end="") print("select COM-port") if i2 == 2: print(" >", end="") print("locked config") optionsMenue() while True: if keyboard.is_pressed('down'): i2 = i2 + 1 if i2 == 3: i2 = 0 clear() optionsMenue() elif keyboard.is_pressed('up'): i2 = i2 - 1 if i2 == -1: i2 = 2 clear() optionsMenue() if keyboard.is_pressed('enter'): if i2 == 0: clear() menue() break if i2 == 1: comConf() if i2 == 2: lockedConf() time.sleep(0.1) def bootloader(): print("what bootloader do you require?") def systemController(): print("what unit do you wish to program?") i = 0 def clear(): os.system("cls") def menue(): if i == 0: print(" >", end="") print("bootloader programming") if i == 1: print(" >", end="") print("system controller programming") if i == 2: print(" >", end="") print("options") menue() try: while True: if keyboard.is_pressed('down'): i = i + 1 if i == 3: i = 0 clear() menue() elif keyboard.is_pressed('up'): i = i - 1 if i == -1: i = 2 clear() menue() elif keyboard.is_pressed('enter'): if i == 0: bootloader() if i == 1: systemController() if i == 2: options() time.sleep(0.1) except Exception as e: print(f"发生错误: {str(e)}") input("按回车键退出...") # 暂停窗口,查看错误信息
内容的提问来源于stack exchange,提问作者Axel Claesson
相关产品推荐
相关产品推荐

