Python Textual开发的TUI打包一键可执行文件遇阻,求解决办法
Textual TUI打包含第三方CLI依赖的可执行文件解决方案
一、PyInstaller打包问题修复
1. 手动指定隐藏导入
PyInstaller经常漏抓动态导入的依赖,snet.cli大概率是通过动态加载的方式被调用,导致没被打包进去。直接在打包命令里加上隐藏导入参数:
pyinstaller --onefile --add-data 'application/app/style.tcss:application/app/' --hidden-import snet.cli --name "TUI v0.1.0 (MacOS)" application/main.py
如果snet.cli还有子模块被用到,比如snet.cli.commands,也要一并加到--hidden-import后面,用逗号分隔。
2. 用.spec文件精细化配置
如果命令行参数搞不定,生成.spec文件手动编辑更灵活:
- 先生成.spec文件:
pyinstaller --onefile --add-data 'application/app/style.tcss:application/app/' --name "TUI v0.1.0 (MacOS)" application/main.py --specpath .
- 打开生成的
.spec文件,找到hiddenimports列表,添加snet.cli及其子模块:
hiddenimports=['snet.cli', 'snet.cli.needed_submodule'],
- 再用.spec文件打包:
pyinstaller "TUI v0.1.0 (MacOS).spec"
3. 验证依赖是否被包含
打包后可以用PyInstaller自带的工具检查内容:
pyi-archive_viewer dist/"TUI v0.1.0 (MacOS)"
搜索snet相关文件,确认是否被正确打包进去。
二、替代打包工具推荐
1. Nuitka
Nuitka把Python代码编译成C再打包,对动态导入的支持比PyInstaller好,性能也更优:
- 安装:
pip install nuitka - 打包命令(注意资源文件的路径映射):
python -m nuitka --standalone --onefile --include-data-file=application/app/style.tcss=./application/app/style.tcss --output-filename="TUI v0.1.0 (MacOS)" application/main.py
2. cx_Freeze
配置简单直观,适合小型项目:
- 安装:
pip install cx_Freeze - 创建
setup.py文件:
from cx_Freeze import setup, Executable executables = [Executable("application/main.py", base=None, target_name="TUI v0.1.0 (MacOS)")] setup( name="TUI", version="0.1.0", description="Textual TUI for snet.cli", executables=executables, options={ "build_exe": { "include_files": [("application/app/style.tcss", "application/app/style.tcss")], "packages": ["snet.cli", "textual"], } } )
- 执行打包:
python setup.py build
内容的提问来源于stack exchange,提问作者ish
相关产品推荐
相关产品推荐

