Ubuntu Upstart管理python scripts 触发的UnicodeEncodeError, Surrogates not allowed

目录

场景描述:

错误排查 — UnicodeEncodeError

解决方案一

解决方案二 

完美解决


场景描述

业务场景包含接收客户端请求的app server跟后台做任务的daemon server两部分,我在测试阶段通过python xxx.py启动两个脚本,并未发现任何的编码问题,后期通过Ubuntu14.04 Upstart管理server发现了UnicodeEncodeError,好长时间都没有解决方案【initctl start/status/restart/stop xxx.conf】,经过不懈的努力在google找到了灵感,期间做了很多尝试,在py文件首行添加 utf-8 根本没起任何作用

错误排查 — UnicodeEncodeError

  • 通过python sys.getfilesystemencoding()可以获取当前环境的编码
  • 通过export log的形式可以了解到通过python xxx.py输出的编码是utf-8,但是通过upstart start service输出的编码是ASCII
  • 这里疑惑大概就知道了,我们通过upstart来管理python scripts时它继承了系统本身的编码格式,所以我们在pyhton scripts里无论怎么设定编码都是无效的
  • 下图是通过python本身跟upstart管理python scripts时输出的编码

Ubuntu Upstart管理python scripts 触发的UnicodeEncodeError, Surrogates not allowed_第1张图片

  • 到这里肯定就明白了,问题的核心是改变宿主系统本身的编码,之前在网上看到了很多帖子都没什么用,不能解决根本问题

解决方案一

在解决问题的过程中,在网上看到过这样一片帖子,他的解决方案是通过指定encode参数来实现编码转换,如果只是简单的参数读取、传递,这种解决方案是没有问题的,但是如果参数是一个路径,并且python scripts中涉及对该文件的读写操作,这种解决方案是不可以的,系统无法识别这个路径,自然会触发No Such file or directory

"bad string".encode('utf-8', 'surrogateescape').decode('utf-8')

链接
https://stackoverflow.com/questions/27366479/python-3-os-walk-file-paths-unicodeencodeerror-utf-8-codec-cant-encode-s

解决方案二 

前面提到,其实解决此问题的关键是要改变Upstart环境变量,这个网上可以查到,upstart 官方链接,这里就不废话了,直接贴Upstart conf文件了,通过在Upstart conf文件里添加的环境变量的形式来设定编码可以有效解决此问题

Ubuntu Upstart管理python scripts 触发的UnicodeEncodeError, Surrogates not allowed_第2张图片

!!! 这里要注意一下,一个项目内所有通过Upstart来管理的service都要添加如上环境变量,一定是所有的service,在前期排查的过程中也到了添加环境变量这一步,但是只给其中一个Upstart conf文件添加了环境变量,导致问题没解决

完美解决

参照上面解决方案二对Upstart conf做处理后,可以看到即便通过Upstart 启动python scripts,输出的编码也是utf-8,没有再触发UnicodeEncodeError,至此问题解决

百度真的是没有什么有价值的东西啊~~~

你可能感兴趣的:(python,Upstart,ubuntu)