解决Python执行Hexo发布命令的编码问题

在开发我的技术博客过程中,遇到了一个Python执行Hexo发布命令时的编码问题。本文将记录问题现象、分析过程和最终解决方案。

问题描述

当使用Python的subprocess模块执行Hexo发布命令时:

1
2
3
4
import subprocess

result = subprocess.run(['hexo', 'deploy'], capture_output=True, text=True)
print(result.stdout)

会遇到以下编码错误:

1
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xXX in position YY

问题分析

经过排查发现:

  1. Hexo输出中包含特殊字符(如表情符号或特定语言字符)
  2. 服务器环境默认编码与本地开发环境不同
  3. Python的subprocess默认使用系统编码处理输出

解决方案

1. 显式指定编码

1
2
3
4
5
result = subprocess.run(['hexo', 'deploy'], 
capture_output=True,
text=True,
encoding='utf-8',
errors='replace')

2. 更新rsync参数(项目信息中已记录)

publish.sh中添加编码转换参数:

1
rsync -avz --delete --iconv=utf-8 public/ user@server:path/to/blog

3. 环境变量设置

在Python脚本开头添加:

1
2
import os
os.environ["PYTHONIOENCODING"] = "utf-8"

验证结果

实施以上修改后:

  • Python脚本能正确处理Hexo输出的所有字符
  • 博客内容完整传输,无乱码问题
  • 发布流程稳定可靠

技术要点:跨平台开发时,显式指定编码比依赖系统默认更可靠

后续改进

  1. 将编码配置加入项目设置
  2. 创建发布日志记录系统
  3. 增加异常处理重试机制
1
2
3
4
5
6
7
// 项目配置更新
{
"encoding_config": {
"python_encoding": "utf-8",
"rsync_iconv_param": "--iconv=utf-8"
}
}