注意:LANG=zh_CN.UTF-8与LANG=en_US.UTF-8不可混淆!¶
LANG=zh_CN.UTF-8与LANG=en_US.UTF-8有区别 , 所以不可混淆!想之前在python2时代吃过坑,没想到到了统一unicode的python3,因环境不一致也能导致编码问题!
当时环境与功能:¶
vps系统是ubutnu 14.04, 相关软件python3.4, selenium3+, chrome66, chromedriver。使用crontab启动shell, shell中启动python脚本, 脚本中selenium启动chrome,……
出bug的运行流程:¶
- crontab中的a.sh启动 LANG=zh_CN.UTF-8 bash a.sh
- a.sh末尾调用”b中文名.py”, 带中文参数”《xxx》”
- b中文.py 中print(参数1) 会异常显示字符串编码问题’ascii’ codec can’t encode characters
调试发现:¶
- print repr(中文参数1), 会打印\udc 开头的而非\x开头的utf8型编码。
- 比如”《” 正常编码是 ‘\xe3\x80\x8a’, 此处确是打印了’\udce3\udc80\udc8a’ 。
- 改变逻辑,直接ssh到vps并执行 b中文.py 《xxx》 没有问题!
问题定位:¶
- 个人本机ubuntu系统测试不会出现bug,vps才出现,所以应该是shell环境或者是python环境问题。
- 打印执行a.sh的shell环境,对比发现本机有LANG=zh_CN.UTF-8和LANGUAGE=zh_CN:zh,vps仅有LANG=zh_CN.UTF-8。
- 把crontab中强加的环境变量LANG=zh_CN.UTF-8去掉,此时a.sh的环境变量为LANG=en_US.UTF-8, vps恢复正常。(2小时排查出结果了!)
- 总结: 之前觉得LANG=zh_CN.UTF-8与LANG=en_US.UTF-8没什么不同,从此改观。
问题解决:¶
去掉LANG=zh_CN.UTF-8,之后执行过程中会自动变成默认LANG=en_US.UTF-8
原因探究:¶
待定
python repr输出udc开头字符串, print(参数)导致异常¶
'/home/maskuser/path/to/ts/\udce3\udc80\udc8a\udce9\udc80\udc97.....mp4'
Traceback (most recent call last):
File "/home/maskuser/pathtodir/script/20181105\udce8\udca7\udc86\.....py", line 73, in <module>
video_upload_testsite(*sys.argv[1:])
File "/home/maskuser/pathtodir/script/20181105\udce8\udca7\udc86\.....py", line 29, in video_upload_testsite
print (videopath)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 27-50: ordinal not in range(128)
原文出自Pythonwood发表的https://blog.pythonwood.com/2018/11/神奇的环境bug导致python3中出现udc开头字符串/
扩展阅读
- XUbuntu18.04(Bionic河狸)正式发布,系统安装升级记录
- 虚拟机系统正式转换——从windows到Linux-ubuntu新手
- 笔记本系统转换Linux一个半月——xubuntu14.04截图纪念里程碑