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時輸出的編碼

  • 到這裏肯定就明白了,問題的核心是改變宿主系統本身的編碼,之前在網上看到了很多帖子都沒什麼用,不能解決根本問題

解決方案一

在解決問題的過程中,在網上看到過這樣一片帖子,他的解決方案是通過指定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文件裏添加的環境變量的形式來設定編碼可以有效解決此問題

!!! 這裏要注意一下,一個項目內所有通過Upstart來管理的service都要添加如上環境變量,一定是所有的service,在前期排查的過程中也到了添加環境變量這一步,但是隻給其中一個Upstart conf文件添加了環境變量,導致問題沒解決

完美解決

參照上面解決方案二對Upstart conf做處理後,可以看到即便通過Upstart 啓動python scripts,輸出的編碼也是utf-8,沒有再觸發UnicodeEncodeError,至此問題解決

百度真的是沒有什麼有價值的東西啊~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章