解決reload(sys)后print失效的問題
python版本: python2.7.6
#查看python默認(rèn)編碼格式
>>> import sys
>>> print sys.getdefaultencoding() #python 2.x 默認(rèn)編碼是ascii格式; python 3.x 默認(rèn)編碼是utf-8格式
ascii
#設(shè)置python默認(rèn)的編碼格式
>>> import sys
>>> print sys.setdefaultencoding('utf-8')
操作如下:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
>>> sys.setdefaultencoding('utf-8')
>>> tmp = ('中國','英國')
>>> tmp
>>> print tmp
>>>
如上面的操作所示:設(shè)置python編碼格式后,print失效了,沒有任何輸出。
解決方法1: 在python代碼中進(jìn)行改變
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#注意:使用此方式,有極大的可能導(dǎo)致print函數(shù)無法打印數(shù)據(jù)!
#改進(jìn)方式如下:
import sys #這里只是一個對sys的引用,只能reload才能進(jìn)行重新加載
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr
reload(sys) #通過import引用進(jìn)來時,setdefaultencoding函數(shù)在被系統(tǒng)調(diào)用后被刪除了,所以必須reload一次
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde
sys.setdefaultencoding('utf-8')
說明:手動執(zhí)行了reload(sys)以后,sys模塊的這三個變量將會被重置,導(dǎo)致輸出無法顯示在IDLE。
所以解決方案很簡單,只需要在reload之前把這三個變量都復(fù)制一份,reload之后再恢復(fù)回來就行了:
解決方法2:python安裝目錄下的lib\site-packages文件夾下新建一個sitecustomize.py。 #推薦此方法
import sys
sys.setdefaultencoding('utf-8')
這樣在python文件中就不用在import模塊后添加
reload(sys)
sys.setdefaultencoding('utf8')
這兩句話了,也不用擔(dān)心print失效的問題
補充知識:Python IDLE reload(sys)后print無法正常執(zhí)行命令的原因
通常大多數(shù)人執(zhí)行reload(sys)這條語句其實僅僅是為了能夠修改Python的默認(rèn)字符集,也就是能夠調(diào)用sys.setdefaultencoding()。但是如果在IDLE中執(zhí)行reload(sys),就會導(dǎo)致接下來無法正常執(zhí)行任何命令。
起初遇到這個問題也是束手無策,后來無意間在stackoverflow上看到有人說到了這個問題。原來是因為IDLE作為一個GUI Shell環(huán)境,在啟動初始化過程中,會設(shè)置特定的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出,使得輸入和輸出都在IDLE的GUI Shell中,可以在IDLE中通過如下方式查看:
>>> import sys >>> print sys.stdin <idlelib.PyShell.PseudoInputFile object at 0x00000000027AF2E8> >>> print sys.stdout <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320> >>> print sys.stderr <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF358> >>>
而如果手動執(zhí)行了reload(sys)以后,sys模塊的這三個變量將會被重置,導(dǎo)致輸出無法顯示在IDLE。所以解決方案很簡單,只需要在reload之前把這三個變量都復(fù)制一份,reload之后再恢復(fù)回來就行了:
>>> stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr >>> reload(sys) >>> sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde >>> print sys.stdout <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320> >>>
細(xì)心的人可能會想到,reload(sys)之后,如果標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都不起作用了,那么relaod(sys)后面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎么能夠執(zhí)行呢?所以其實reload(sys)之后、恢復(fù)之前,標(biāo)準(zhǔn)輸入還是可以正常工作的,可以通過如下代碼來檢驗:
>>> reload(sys) >>> sys.stdout=stdo >>> print sys.stdin <open file '<stdin>', mode 'r' at 0x0000000001CAB030> >>> print sys.stdout <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320> >>> print sys.stderr <open file '<stderr>', mode 'w' at 0x0000000001CAB150> >>>
所以問題就解決了,但是必須要強調(diào):
千萬不要輕易使用reload(sys),除非你完全清除這么做帶來的結(jié)果!僅僅為了能夠重新設(shè)定Python的默認(rèn)編碼就執(zhí)行reload(sys)更是非常不明智的行為!
Python的設(shè)計者故意在Python初始化完成以后刪除sys模塊里面的setdefaultencoding()方法,就是為了不讓在運行時隨意更改Python默認(rèn)編碼,以免出現(xiàn)一些未知的問題。事實上,關(guān)于編碼問題,完全有別的更可靠的方法解決。
以上這篇解決reload(sys)后print失效的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python偏函數(shù)Partial function使用方法實例詳解
這篇文章主要介紹了Python偏函數(shù)Partial function使用方法實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
基于python實現(xiàn)圖片轉(zhuǎn)字符畫代碼實例
這篇文章主要介紹了基于python實現(xiàn)圖片轉(zhuǎn)字符畫代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Python3.x+迅雷x 自動下載高分電影的實現(xiàn)方法
這篇文章主要介紹了Python3.x+迅雷x 自動下載高分電影的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Python基礎(chǔ)學(xué)習(xí)之類與實例基本用法與注意事項詳解
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)之類與實例基本用法與注意事項,結(jié)合實例形式詳細(xì)分析了Python面相對象程序設(shè)計中關(guān)于類的定義與實例化對象相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-06-06
python實現(xiàn)從字符串中找出字符1的位置以及個數(shù)的方法
這篇文章主要介紹了python實現(xiàn)從字符串中找出字符1的位置以及個數(shù)的方法,對于Python字符串操作的學(xué)習(xí)有一定的幫助與借鑒作用,需要的朋友可以參考下2014-08-08

