Python常見報錯 - 運維筆記


 

一、"ascii' codec can't encode character"
之前部署了openstack虛擬化環境,有一天在使用nova list查看虛擬機的時候,突然報錯!如下:

[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在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理常常會報這樣的錯,python沒辦法處理非ascii編碼的,此時需要自己設置將python的默認編碼,一般設置為utf8的編碼格式。查閱網上,可以在程序中修改所有涉及到編碼的地方,強制編碼為utf8,即添加代碼encode("utf8"),這種方法並不推薦使用,因為一旦少寫一個地方,將會導致大量的錯誤報告。

下面介紹一個一次性修改后永久生效的方法:

在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-packages

[root@linux-node1 nova]# cd /usr/lib/python2.7/site-packages/
[root@linux-node1 site-packages]# cat sitecustomize.py #添加如下內容,設置編碼為utf8
# encoding=utf8
import sys

reload(sys)
sys.setdefaultencoding('utf8')

此時重啟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     |
+--------------------------------------+----------------------------+--------+------------+-------------+--------------------+

############################################################################
注意:上面是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界面里進行系統用戶推送操作,就不會報這個錯誤了!

二、pip安裝包出現Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

# pip install pymysql 
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError
('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x0000015CFEC01A60>: Failed to establish a new connection: [WinError 10061] 
由於目標計算機積極拒絕,無法連接。')': /simple/pylint/

解決辦法:添加國內pip源的url地址
# pip install pymysql -i url

目前國內比較靠譜常用的幾個pip源
阿里雲 http://mirrors.aliyun.com/pypi/simple/
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/

例如安裝pymysql,則命令如下:
# pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM