Files
dtm-py-all/打包说明.md

222 lines
5.5 KiB
Markdown
Raw Normal View History

# DTM 工业测试管理系统 - PyInstaller 打包说明
## 📦 打包环境要求
- **Python 版本**: Python 3.7+
- **Conda 环境**: dtmgt
- **打包工具**: PyInstaller
## 🚀 打包步骤
### 1. 激活 Conda 环境
```powershell
conda activate dtmgt
```
### 2. 清理之前的打包文件(推荐)
```powershell
Remove-Item -Recurse -Force build, dist -ErrorAction SilentlyContinue
```
### 3. 执行打包命令
#### **正式版本(无控制台窗口)**
```powershell
# 在项目根目录执行
pyinstaller --clean dtmgtApp.spec
```
生成文件:`dist\dtmgtApp.exe`
- ✅ 无CMD控制台窗口
- ✅ 日志自动保存到 `logs\` 目录
- ✅ 适合生产环境使用
#### **调试版本(带控制台窗口)**
```powershell
# 在项目根目录执行
pyinstaller --clean dtmgtApp-debug.spec
```
生成文件:`dist\dtmgtApp-debug.exe`
- ✅ 显示CMD控制台窗口
- ✅ 实时查看日志输出
- ✅ 适合开发调试使用
### 4. 查看打包结果
打包成功后,可执行文件位于:
- 正式版:`dist\dtmgtApp.exe`
- 调试版:`dist\dtmgtApp-debug.exe`
## 📋 控制台窗口控制
### 方式一使用不同的spec文件
| Spec 文件 | Console | 用途 | 日志输出 |
|-----------|---------|------|----------|
| `dtmgtApp.spec` | False | 生产环境 | `logs/dtmgt_*.log` |
| `dtmgtApp-debug.spec` | True | 调试开发 | 控制台实时显示 |
### 方式二:使用命令行参数(正式版)
即使使用 `dtmgtApp.exe`(无控制台),也可以通过命令行参数控制行为:
```powershell
# 查看所有可用参数
.\dtmgtApp.exe --help
# 常用参数示例
.\dtmgtApp.exe --mock # 启用PLC模拟模式
.\dtmgtApp.exe --no-ui # 不启动UI仅后台服务
.\dtmgtApp.exe --port 8080 # 指定HTTP服务端口
```
### 日志文件位置
正式版(无控制台)运行时,日志自动保存到:
```
<exe所在目录>\logs\dtmgt_YYYYMMDD_HHMMSS.log
```
例如:
```
E:\WORK\DTM-PY-ALL\dist\logs\dtmgt_20251209_143052.log
```
## 🔧 Spec 文件配置说明
### 关键配置项
#### 1. **SSL DLL 依赖**(已解决)
```python
# 自动收集 Conda 环境中的 SSL DLL
conda_dll_dir = os.path.join(conda_prefix, 'Library', 'bin')
# 包含: libcrypto-1_1-x64.dll, libssl-1_1-x64.dll
```
#### 2. **UI 模块包含**
```python
# 包含整个 UI 目录及所有子模块
('UI', 'UI'),
# 自动收集所有子模块
ui_hiddenimports = collect_submodules('UI')
```
#### 3. **资源文件包含**
```python
datas=[
('web', 'web'), # Web 资源
('UI', 'UI'), # UI 模块
('db', 'db'), # 数据库文件
]
```
#### 4. **排除不需要的模块**
```python
excludes=[
'serial.tools.list_ports_osx', # macOS 串口工具
'PyQt5.QtDBus', # DBus 支持
]
# 过滤不需要的 SQL 驱动(保留 SQLite
a.binaries = [x for x in a.binaries if not (
'qsqlpsql' in x[0] or # PostgreSQL
'qsqlmysql' in x[0] or # MySQL
'qsqlodbc' in x[0] # ODBC
)]
```
## ⚠️ 常见警告说明
### 1. Hidden import "sip" not found
- **影响**: 无影响
- **原因**: PyQt5 旧版本遗留,新版本使用 PyQt5.sip
- **处理**: 可忽略
### 2. Ignoring macOS frameworks
- **影响**: 无影响
- **原因**: pyserial 跨平台代码Windows 上不会使用
- **处理**: 已在 excludes 中排除
### 3. Library not found: LIBPQ.dll
- **影响**: 无影响(不使用 PostgreSQL
- **原因**: PyQt5 PostgreSQL 驱动缺少依赖
- **处理**: 已过滤掉 PostgreSQL 驱动
### 4. cannot import name 'ttk' from 'tkinter'
- **影响**: 启动提示窗口无法显示,程序崩溃
- **原因**: PyInstaller 未自动包含 tkinter.ttk 模块
- **处理**: 已在 spec 文件的 hiddenimports 中添加 'tkinter.ttk' 和 '_tkinter'
## ✅ 验证打包结果
### 1. 检查文件大小
正常的打包文件应该在 100-300 MB 之间(包含所有依赖)
### 2. 测试运行
```powershell
cd dist
# 正式版(无控制台)
.\dtmgtApp.exe
# 调试版(带控制台)
.\dtmgtApp-debug.exe
# 使用PLC模拟模式运行
.\dtmgtApp.exe --mock
```
### 3. 检查必要的 DLL
打包后的可执行文件应该包含:
- libcrypto-1_1-x64.dll
- libssl-1_1-x64.dll
- _ssl.pyd
- _hashlib.pyd
### 4. 检查 tkinter 模块
使用调试版运行,确认启动提示窗口正常显示:
```powershell
.\dtmgtApp-debug.exe
# 应该能看到蓝色边框的“系统启动中”提示窗口
```
## 🔧 故障排查
### 问题 1: SSL DLL 缺失错误
```
ImportError: DLL load failed while importing _ssl
```
**解决方案**: 确保在 Conda 环境中打包spec 文件会自动收集 SSL DLL
### 问题 2: 找不到 UI 模块
```
ModuleNotFoundError: No module named 'UI.views'
```
**解决方案**: 确保 spec 文件中包含了 `('UI', 'UI')` 并使用了 `collect_submodules('UI')`
### 问题 3: 找不到数据库文件
```
sqlite3.OperationalError: unable to open database file
```
**解决方案**: 检查代码中的数据库路径,使用相对路径或 `sys._MEIPASS`
## 📝 打包优化建议
### 1. 减小文件体积
- 排除不需要的模块(已配置)
- 使用 `--exclude-module` 排除大型库
### 2. 提高启动速度
- 考虑使用 `--onedir` 模式(而非 `--onefile`
- 减少不必要的 hiddenimports
### 3. 调试打包问题
```powershell
# 启用调试模式
pyinstaller --clean --debug all dtmgtApp.spec
```
## 📞 联系支持
如果遇到打包问题,请提供:
1. 完整的错误信息
2. 打包日志文件 `build\dtmgtApp\warn-dtmgtApp.txt`
3. Python 和依赖包版本信息