以前部署了openstack虛擬化環境,有一天在使用nova list查看虛擬機的時候,忽然報錯!以下:node
[root@linux-node1 src]# nova list
ERROR (UnicodeEncodeError): 'ascii' codec can't encode character u'\uff08' in position 9: ordinal not in range(128)python
python在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理經常會報這樣的錯,python沒辦法處理非ascii編碼的,此時須要本身設置將python的默認編碼,通常設置爲utf8的編碼格式。linux
查閱網上,能夠在程序中修改全部涉及到編碼的地方,強制編碼爲utf8,即添加代碼encode("utf8"),這種方法並不推薦使用,由於一旦少寫一個地方,將會致使大量的錯誤報告。vim
-------------------------------------------------
這裏介紹一個一次性修改後永久生效的方法:
在python的lib\site-packages文件夾下新建一個sitecustomize.py
[root@linux-node1 nova]# find / -name site-packages
/usr/lib/python2.7/site-packages
/usr/lib64/python2.7/site-packagesapi
[root@linux-node1 nova]# cd /usr/lib/python2.7/site-packages/
[root@linux-node1 site-packages]# cat sitecustomize.py #添加以下內容,設置編碼爲utf8
# encoding=utf8
import sys bash
reload(sys)
sys.setdefaultencoding('utf8')python2.7
此時重啓python解釋器,執行sys.getdefaultencoding(),發現編碼已經被設置爲utf8的了,屢次重啓以後,效果相同,這是由於系統在python啓動的時候,自行調用該文件,設置系統的默認編碼,而不須要每次都手動的加上解決代碼,屬於一勞永逸的解決方法。測試
[root@linux-node1 nova]# python #終端進入python,便是重啓python解釋器!能夠屢次進入
Python 2.7.5 (default, Aug 18 2016, 15:58:25)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>編碼
接着,再次使用nova list命令,就沒有那個報錯了!
[root@linux-node1 src]# nova list
+--------------------------------------+----------------------------+--------+------------+-------------+--------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+----------------------------+--------+------------+-------------+--------------------+
| b6a4738d-7e01-4068-a09b-7008b612d126 | beta-new1(beta環境1) | ACTIVE | - | Running | flat=192.168.1.151 |
| 9acdb28b-02c2-41bb-87c4-5f3a8fa008ab | dev-new-test1(測試環境1) | ACTIVE | - | Running | flat=192.168.1.150 |
| 30e5ba3e-3942-4119-9ba6-7523cf865b6f | kvm-server003 | ACTIVE | - | Running | flat=192.168.1.152 |
| a2893208-3ec9-4606-ab82-d7a870206cb9 | kvm-server004 | ACTIVE | - | Running | flat=192.168.1.153 |
| 3483d9f1-4015-48d9-9837-b67ca82dd54d | kvm-server005 | ACTIVE | - | Running | flat=192.168.1.154 |
+--------------------------------------+----------------------------+--------+------------+-------------+--------------------+spa
===================================================================
注意:上面是python7環境下的報錯解決方案,若是換成python6會怎麼解決呢?
若是是python6環境報這個錯誤,則/usr/lib/python2.6/site-packages下是沒有這個sitecustomize.py文件的。 那麼這個時候就要看具體的報錯文件了,在該文件的代碼開頭處添加以下代碼: import sys reload(sys) sys.setdefaultencoding('utf8') 好比,在jumpserver界面裏推送系統用戶的時候報錯: ERROR (UnicodeEncodeError): 'ascii' codec can't encode character u'\uff08' in position 9: ordinal not in range(128) 從報錯界面裏找出錯誤所在的文件是/data/jumpserver/jperm/ansible_api.py 則解決辦法: [root@jumpserver01 ~]# cp /data/jumpserver/jperm/ansible_api.py /data/jumpserver/jperm/ansible_api.py.bak [root@jumpserver01 ~]# vim /data/jumpserver/jperm/ansible_api.py # -*- coding: utf-8 -*- import sys #也就是在該文件代碼開頭添加這三行內容 reload(sys) sys.setdefaultencoding('utf8') 而後再在jumpserver界面裏進行系統用戶推送操做,就不會報這個錯誤了!