170 lines
4.2 KiB
Markdown
170 lines
4.2 KiB
Markdown
# Python版本兼容性说明
|
||
|
||
## 问题分析
|
||
|
||
原始脚本使用了Python 3.7+的语法特性,在Python 3.6环境运行报错:
|
||
|
||
```
|
||
SyntaxError: invalid syntax
|
||
```
|
||
|
||
### 具体问题
|
||
1. **`from __future__ import annotations`** - Python 3.7+特性
|
||
2. **类型注解语法** `-> None` - 在`__future__`导入后变为强制语法
|
||
|
||
## 解决方案
|
||
|
||
### 文件版本说明
|
||
|
||
| 文件名 | Python版本 | 特性支持 | 适用环境 |
|
||
|--------|-----------|----------|----------|
|
||
| `02_parse_score_data_fixed.py` | 3.7+ | 类型注解 + f-string | 开发环境 |
|
||
| `02_parse_score_data_py36.py` | 3.6+ | 移除类型注解 | 兼容版本 |
|
||
| `02_parse_score_data_py36_compatible.py` | 3.6+ | 移除类型注解 + .format()格式 | 中等兼容环境 |
|
||
| `02_parse_score_data_py34_compatible.py` | 3.4+ | 无typing模块 + .format()格式 | **超老环境推荐** |
|
||
|
||
### 常见错误及解决方案
|
||
|
||
#### 错误:`ImportError: No module named typing`
|
||
**原因**: Python版本过低(< 3.5)或未安装typing模块
|
||
**解决**: 使用 `02_parse_score_data_py34_compatible.py`
|
||
|
||
#### 错误:`SyntaxError: invalid syntax` (f-string)
|
||
**原因**: Python版本不支持f-string(< 3.6)
|
||
**解决**: 使用带`.format()`的兼容版本
|
||
|
||
#### 错误:`SyntaxError: invalid syntax` (类型注解)
|
||
**原因**: Python版本不支持类型注解语法
|
||
**解决**: 使用移除类型注解的版本
|
||
|
||
### 生产环境使用
|
||
|
||
#### 方法1:智能启动脚本(强烈推荐)
|
||
```bash
|
||
# 自动检测Python版本和可用模块,自动选择最合适的脚本版本
|
||
./run_parser.sh
|
||
|
||
# 查看运行日志
|
||
tail -f 2.log
|
||
```
|
||
|
||
#### 方法2:手动选择版本
|
||
```bash
|
||
# 对于超老环境(Python < 3.6 或无typing模块)
|
||
nohup python3 02_parse_score_data_py34_compatible.py > 2.log 2>&1 &
|
||
|
||
# 对于Python 3.6环境
|
||
nohup python3 02_parse_score_data_py36_compatible.py > 2.log 2>&1 &
|
||
```
|
||
|
||
#### 方法2:直接运行
|
||
```bash
|
||
# Python 3.6环境使用完全兼容版本
|
||
nohup python3 02_parse_score_data_py36_compatible.py > 2.log 2>&1 &
|
||
|
||
# 查看运行日志
|
||
tail -100f 2.log
|
||
```
|
||
|
||
#### 进程管理
|
||
```bash
|
||
# 查看进程状态
|
||
ps aux | grep python
|
||
|
||
# 停止进程
|
||
kill $(cat parser.pid)
|
||
|
||
# 查看日志统计
|
||
grep "解析成功" 2.log | wc -l # 成功记录数
|
||
grep "解析失败" 2.log | wc -l # 失败记录数
|
||
```
|
||
|
||
### 版本对比
|
||
|
||
#### 02_parse_score_data_py36_compatible.py (推荐用于生产环境)
|
||
- ✅ 完全兼容Python 3.6
|
||
- ✅ 使用 `.format()` 替代 f-string
|
||
- ✅ 移除所有类型注解
|
||
- ✅ 避免复杂的字符串嵌套表达式
|
||
- ✅ 稳定的生产环境运行
|
||
|
||
### 代码修改内容
|
||
|
||
#### 移除的特性
|
||
```python
|
||
# 移除此行
|
||
from __future__ import annotations
|
||
|
||
# 函数定义从:
|
||
def connect_db(self) -> None:
|
||
# 改为:
|
||
def connect_db(self):
|
||
```
|
||
|
||
#### 保持兼容的特性
|
||
- f-string (Python 3.6+)
|
||
- `pathlib` (Python 3.6+)
|
||
- `dataclasses` (Python 3.7+但未使用)
|
||
|
||
## 版本检测脚本
|
||
|
||
```bash
|
||
# 检查Python版本
|
||
python3 --version
|
||
|
||
# 检查语法兼容性
|
||
python3 -m py_compile 02_parse_score_data_py36.py
|
||
```
|
||
|
||
## 环境升级建议
|
||
|
||
如果可能,建议升级生产环境到Python 3.8+,这样可以:
|
||
- 使用更新的pandas版本
|
||
- 获得更好的性能
|
||
- 支持完整的类型注解语法
|
||
- 使用现代的异步特性
|
||
|
||
## 故障排除指南
|
||
|
||
#### 问题1:`ImportError: No module named typing`
|
||
```bash
|
||
# 原因:Python版本过低(< 3.5)
|
||
# 解决:使用无typing版本
|
||
python3 02_parse_score_data_py34_compatible.py
|
||
```
|
||
|
||
#### 问题2:`SyntaxError: invalid syntax` (f-string相关)
|
||
```bash
|
||
# 原因:Python版本不支持f-string(< 3.6)
|
||
# 解决:使用.format()版本
|
||
python3 02_parse_score_data_py36_compatible.py
|
||
```
|
||
|
||
#### 问题3:依赖安装失败
|
||
```bash
|
||
# 检查依赖安装
|
||
pip3 install --user -r requirements-prod.txt
|
||
python3 test_dependencies.py
|
||
```
|
||
|
||
#### 问题4:数据库连接问题
|
||
```bash
|
||
# 检查数据库配置
|
||
python3 -c "from db_config import DB_CONFIG; print('配置正确')"
|
||
```
|
||
|
||
#### 通用诊断命令
|
||
```bash
|
||
# 检查Python版本
|
||
python3 --version
|
||
|
||
# 检查typing模块
|
||
python3 -c "import typing; print('typing可用')" 2>/dev/null || echo "无typing模块"
|
||
|
||
# 检查依赖
|
||
python3 -c "import pymysql, pandas, sqlalchemy; print('依赖正常')"
|
||
|
||
# 测试脚本语法
|
||
python3 -m py_compile 02_parse_score_data_py34_compatible.py && echo "语法正确"
|
||
```
|