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

Python程序在VSCode正常运行,打包为exe后自动关闭求助

问题分析与解决方案

嘿,我来帮你捋清楚这个问题的根源,以及怎么解决它!

首先,VS Code里运行正常,但打包成exe后窗口直接闪退,核心原因是你的异常处理没有覆盖所有可能的错误场景,导致程序遇到未捕获的错误时直接崩溃终止,根本没机会执行最后的input("Press any key to stop the program: ")语句。

具体问题出在哪?

看你的getError()函数:

def getError():
    f=open("errors.txt","r")  # 这里是隐患!如果文件不存在会直接抛出FileNotFoundError
    data=f.read()
    try:
        # ... 你的逻辑代码 ...
    except ZeroDivisionError:
        print("Sorry, there's nothing in this file")
    getError()

在VS Code里,你大概率已经手动创建了errors.txt文件,所以没触发文件不存在的错误;但打包成exe后,如果运行目录里没有这个文件,open("errors.txt","r")会抛出FileNotFoundError,而这个异常不在你捕获的ZeroDivisionError范围内,程序会直接终止,跳过后续所有代码(包括最后的input语句)。

另外还有个小细节:你的f.close()放在try块末尾,如果try块里出现异常,f.close()不会执行,会导致文件句柄泄漏,最好用with语句自动管理文件。

修复方案

我们需要调整异常处理逻辑,覆盖所有可能的错误,同时确保不管程序是否出错,最后的input语句都能执行。

方案1:完善getError()的异常捕获与文件管理

修改后的getError()函数:

def getError():
    try:
        # 用with语句自动关闭文件,避免句柄泄漏
        with open("errors.txt","r") as f:
            data=f.read()
            error_list=[]
            interations=iter(data)
            for char in range(len(data)):
                try:
                    thing=next(interations)
                except StopIteration:
                    continue
                if thing == "*":
                    # 优化读取逻辑,避免多次next导致的异常
                    error_str = ""
                    for _ in range(4):
                        try:
                            error_str += next(interations)
                        except StopIteration:
                            break
                    try:
                        error=float(error_str)
                        error_list.append(error)
                    except ValueError:
                        print(f"Warning: Invalid error value '{error_str}' found in file")
            if error_list:
                print(f"The current total error is: {sum(error_list)/len(error_list):.2f}")
            else:
                print("Sorry, there's no valid error data in this file")
    except FileNotFoundError:
        print("Error: 'errors.txt' file not found! Please run the program again after creating it.")
    except Exception as e:  # 捕获其他未知异常,方便调试
        print(f"An unexpected error occurred: {str(e)}")

方案2:确保最后的input语句总能执行

把整个程序逻辑放到一个大的try-except-finally块里,这样不管程序有没有出错,finally里的input都会执行,不会直接闪退:

def getError():
    # 这里放上面修改后的getError函数代码

try:
    getError()
    numberOfCases=int(input("How many tests are you inputting? "))
    if numberOfCases != 0:
        print("NOTE: Time follows 24-hour notation")
        for i in range(numberOfCases):
            print(f"Please enter case number {i+1}")
            # 同样用with管理写入的文件
            with open("errors.txt","a") as f:
                curaTime=input("Cura estimated time: ")
                startTime=input("Start time: ")
                endTime=input("End time: ")
                if int(endTime)<int(startTime):
                    endTime = str(int(endTime)+2400)
                actualTime=60*(int(endTime[0:2])-int(startTime[0:2]))+(int(endTime[2:4])-int(startTime[2:4]))
                estimatedTime= 60*(int(curaTime[0:2]))+int(curaTime[2:4])
                error=(actualTime-estimatedTime)/(estimatedTime)+1
                f.write(f"{curaTime},{startTime},{endTime},*{round(error,2)}\n")
            getError()
except Exception as e:
    print(f"Program error: {str(e)}")
finally:
    input("Press any key to stop the program: ")

额外调试小技巧

测试打包后的exe时,别直接双击它,手动打开命令提示符,然后导航到exe所在目录,输入exe文件名运行——这样就算程序出错,你也能看到完整的错误提示,方便排查问题。

内容的提问来源于stack exchange,提问作者Daniel T. Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:37:35