PyInstaller打包NiceGUI应用遇Uvicorn AttributeError及技术选型咨询
问题与解决方案
环境信息
- Python 3.11.5
- PyInstaller 6.3.0
- NiceGUI 1.4.10
- Uvicorn 0.25.0
- Windows 10
打包报错问题
使用PyInstaller打包基于NiceGUI和Uvicorn的应用后运行报错,错误栈如下:
Traceback (most recent call last): File "main.py", line 5, in <module> File "nicegui\ui_run.py", line 171, in run ChangeReload(config, target=Server.instance.run, sockets=[sock]).run() File "uvicorn\supervisors\basereload.py", line 49, in run File "uvicorn\supervisors\basereload.py", line 82, in startup File "uvicorn\_subprocess.py", line 37, in get_subprocess AttributeError: 'NoneType' object has no attribute 'fileno'
测试代码与打包脚本
基础示例代码
from nicegui import ui ui.button('Show Notification', on_click=lambda: ui.notify('Button Clicked')) ui.run(native=True)
打包脚本
import os import subprocess from pathlib import Path import nicegui cmd = [ 'PyInstaller', '--name', 'MyButton', '--onefile', '--windowed', '--add-data', f'{Path(nicegui.__file__).parent}{os.pathsep}nicegui', '--clean', 'main.py' ] print(f'Command: {cmd}') subprocess.call(cmd)
用户需求
拟开发一款跨平台应用,需满足:
- 执行各类Python脚本
- 连接MSSQL Server、Snowflake、Salesforce等数据源
- 支持用户输入凭证执行ETL或数据操作
- 免Python环境独立运行(此前使用Tkinter存在macOS兼容性问题,转而考虑NiceGUI)
咨询问题
- 如何解决上述打包后的AttributeError?
- NiceGUI是否适配该需求?或有无其他推荐技术方案?
解决方案
1. 解决打包后的AttributeError
该错误源于Uvicorn的开发模式重载机制在打包环境中无法获取标准输入输出的文件描述符,可通过以下方式解决:
- 关闭自动重载:在
ui.run()中添加reload=False参数,打包后的生产环境无需热重载功能,修改后的代码:from nicegui import ui ui.button('Show Notification', on_click=lambda: ui.notify('Button Clicked')) ui.run(native=True, reload=False) - 调整打包参数:若不需要隐藏控制台,可去掉
--windowed参数;若保留--windowed,需配合reload=False避免控制台资源依赖。同时补充缺失的隐式依赖,修改后的打包脚本:cmd = [ 'PyInstaller', '--name', 'MyButton', '--onefile', # '--windowed', # 需无控制台窗口时保留,必须配合reload=False '--add-data', f'{Path(nicegui.__file__).parent}{os.pathsep}nicegui', '--hidden-import', 'uvicorn.logging', '--hidden-import', 'uvicorn.loops.asyncio', '--clean', 'main.py' ] - 重新打包验证:修改后重新执行打包脚本,运行生成的可执行文件即可解决该错误。
2. NiceGUI适配性与替代方案
NiceGUI适配性
NiceGUI完全适配你的需求:
- 跨平台兼容:基于Web技术,天然支持Windows、macOS、Linux,无Tkinter的兼容性问题;
- 数据源集成:可直接对接
pyodbc(MSSQL)、snowflake-connector-python(Snowflake)、simple-salesforce(Salesforce)等库,实现数据源连接与ETL操作; - 脚本执行:通过
subprocess或安全可控的代码执行机制,实现用户脚本运行; - 打包部署:支持PyInstaller打包为独立可执行文件,满足免Python环境运行要求;
- UI交互:提供表单、按钮、表格等丰富组件,可快速实现凭证输入、结果展示等交互逻辑。
替代技术方案
若需其他选项,可考虑:
- PyWebView:将Web界面嵌入原生窗口,支持Vue/React等前端框架,适合需要复杂前端交互的场景;
- Flet:基于Flutter的Python UI框架,提供原生质感的跨平台界面,组件丰富且打包简单;
- Streamlit:快速构建数据应用,适合以数据展示分析为主的场景,但打包部署需额外处理,交互灵活性略低于NiceGUI。
内容的提问来源于stack exchange,提问作者Atef Syed
相关产品推荐
相关产品推荐

