PyInstaller打包的EEG P300检测脚本exe运行报Unhandled exception错误求解
问题原因
打包时使用的-w参数(等价于--windowed/--noconsole)会将程序打包为无控制台的窗口应用,运行时系统不会为程序分配标准输入流sys.stdin与标准输出流sys.stdout。而你的代码中使用input()函数需要从控制台读取用户输入,没有对应输入流就会触发input() lost sys.stdin报错。
可选解决方案
- 方案1:去掉
-w参数重新打包
直接执行打包命令:
打包后的exe运行时会自动弹出控制台窗口,可正常输入csv文件路径,代码中的pyinstaller --onefile program.pyprint()输出也能正常展示。 - 方案2:保留无控制台模式,改用图形化选择框获取文件路径
如果你不想显示控制台窗口,可以把原代码中input()相关逻辑替换为GUI文件选择框,修改示例如下:
修改完成后再使用原命令# 新增导入tkinter相关组件 import tkinter as tk from tkinter import filedialog import pandas as pd import argparse # 初始化并隐藏tkinter主窗口 root = tk.Tk() root.withdraw() # 弹出文件选择框,仅允许选择csv文件 csv_path = filedialog.askopenfilename(title="选择EEG数据CSV文件", filetypes=[("CSV格式文件", "*.csv")]) # 处理用户取消选择的情况 if not csv_path: exit() df = pd.read_csv(csv_path.strip()) # 后续代码保持不变pyinstaller --onefile -w program.py打包即可正常运行。 - 方案3:恢复命令行参数逻辑
你代码中已经写了注释掉的argparse参数解析逻辑,只需要修正语法错误后启用即可:
打包后用户可以直接通过命令行传入文件路径,示例调用:import pandas as pd import argparse parser = argparse.ArgumentParser(description='A program for p300 detection in continuous EEG signal') parser.add_argument('-f', '--file', type = str, default = 'museMonitor_845.csv', help = 'input csv file') # 修正原代码的语法错误:parse_args()需要用parser实例调用 args = parser.parse_args() csv_path = args.file df = pd.read_csv(csv_path.strip()) # 后续代码保持不变
这种方案适合需要批量调用程序的场景。program.exe -f 你的csv文件路径
内容的提问来源于stack exchange,提问作者Zabir Al Nazi Nabil
相关产品推荐
相关产品推荐

