一次重啟服務(wù)器后,supervisor接管的python腳本中的函數(shù)open()和print()都會(huì)報(bào)下面的編碼錯(cuò)誤:
UnicodeEncodeError: 'ascii' codec can't encode
使用的是python3,按理說編碼都會(huì)默認(rèn)utf-8,而且本地運(yùn)行的python腳本并沒有這個(gè)問題。
經(jīng)大佬指點(diǎn),增加環(huán)境變量export LC_ALL="en_US.UTF-8"后,再重啟supervisor,問題解決
LC_ALL相關(guān)信息:
下面是復(fù)制的:https://www.cnblogs.com/badboy200800/p/11215981.html
1.Locale說明
Locale是一個(gè)軟件在運(yùn)行時(shí)的語言環(huán)境,。是根據(jù)計(jì)算機(jī)用戶所使用的語言,所在國家或者地區(qū),以及當(dāng)?shù)氐奈幕瘋鹘y(tǒng)所定義的。它包括語言(Language), 地域 (Territory) 和字符集(Codeset)。
一個(gè)locale的書寫格式為: 語言[地域[.字符集]]。完全的locale表達(dá)方式是 [語言[地域][.字符集] [@修正值]。例如:
zh_CN.GB2312 => 中文_中華人民共和國+國標(biāo)2312字符集。
2.Locale查看
(1)locale把按照所涉及到的文化傳統(tǒng)的各個(gè)方面分成12個(gè)大類
[root@TDExpress1620_Sles11:~]$ locale
LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" #語言符號(hào)及其分類
LC_NUMERIC="en_US.UTF-8" #數(shù)字
LC_TIME="en_US.UTF-8" #時(shí)間顯示格式
LC_COLLATE="en_US.UTF-8" #比較和排序習(xí)慣
LC_MONETARY="en_US.UTF-8" #貨幣單位
LC_MESSAGES="en_US.UTF-8" #信息主要是提示信息,錯(cuò)誤信息,狀態(tài)信息,標(biāo)題,標(biāo)簽,按鈕和菜單等
LC_PAPER="en_US.UTF-8" #默認(rèn)紙張尺寸大小
LC_NAME="en_US.UTF-8" #姓名書寫方式
LC_ADDRESS="en_US.UTF-8" #地址書寫方式
LC_TELEPHONE="en_US.UTF-8" #電話號(hào)碼書寫方式
LC_MEASUREMENT="en_US.UTF-8" #度量衡表達(dá)方式
LC_IDENTIFICATION="en_US.UTF-8" #對(duì)locale自身包含信息的概述
LC_ALL=en_US.UTF-8 </pre>
(2)查看標(biāo)準(zhǔn)字符集列表
[root@TDExpress1620_Sles11:~]$ locale -a
zh_CN
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.utf8
zh_SG
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.utf8</pre>
常用字符集:en_US.utf8、zh_CN.gb2312、zh_CN.gbk、zh_CN.utf8等
3.Locale的設(shè)定
LC_ALL和LANG優(yōu)先級(jí)的關(guān)系:LC_ALL > LC_* >LANG
(1)如果需要一個(gè)純中文的系統(tǒng)的話,設(shè)定LC_ALL= zh_CN.XXXX即可?;蛘咴O(shè)定LANG=zh_CN.XXXX也可以,但是LC_不要有任何特殊設(shè)定才可以(因?yàn)長C_優(yōu)先級(jí)高)。
(2)如果需要個(gè)性化的環(huán)境,例如只想要一個(gè)可以輸入中文的環(huán)境,而保持菜單、標(biāo)題,系統(tǒng)信息等等為英文界面,那么只需要設(shè)定LANG=en_US.XXXX,然后 LC_CTYPE=zh_CN.XXXX就可以了。
(3)假如什么也不做的話,也就是LC_ALL,LANG和LC_*均不指定特定值的話,系統(tǒng)將采用POSIX作為lcoale,也就是C locale。
4.查看與設(shè)定字符集實(shí)踐
(1)查看當(dāng)前系統(tǒng)字符集三種方式(LC_ALL、LC_CTYPE和LANG),以查看LANG為例:
[root@TDExpress1620_Sles11:~]$ echo $LANG
en_US.UTF-8 [root@TDExpress1620_Sles11:~]$ env |grep -i LANG
LANG=en_US.UTF-8 [root@TDExpress1620_Sles11:~]$ locale |grep -i LANG
LANG=en_US.UTF-8</pre>
(2)更改系統(tǒng)字符集
export LANG=<字符集名稱>
或者
export LC_ALL=<字符集名稱>
備注:直接執(zhí)行上述命令,可以臨時(shí)修改系統(tǒng)字符集。如果寫入環(huán)境變量可以永久改變字符集。
(3)取消當(dāng)前系統(tǒng)字符集(設(shè)定為空)
unset LANG
備注:直接執(zhí)行上述命令,可以臨時(shí)修改系統(tǒng)字符集。如果寫入環(huán)境變量可以永久改變字符集。