溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

reload(sys)后print失效怎么辦

發(fā)布時(shí)間:2020-07-30 14:49:06 來(lái)源:億速云 閱讀:167 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了reload(sys)后print失效怎么辦,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。

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 = ('中國(guó)','英國(guó)')
>>> tmp
>>> print tmp
>>> 

如上面的操作所示:設(shè)置python編碼格式后,print失效了,沒(méi)有任何輸出。

解決方法1: 在python代碼中進(jìn)行改變

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
#注意:使用此方式,有極大的可能導(dǎo)致print函數(shù)無(wú)法打印數(shù)據(jù)!

#改進(jìn)方式如下:
import sys #這里只是一個(gè)對(duì)sys的引用,只能reload才能進(jìn)行重新加載
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr 
reload(sys) #通過(guò)import引用進(jìn)來(lái)時(shí),setdefaultencoding函數(shù)在被系統(tǒng)調(diào)用后被刪除了,所以必須reload一次
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 
sys.setdefaultencoding('utf-8')

說(shuō)明:手動(dòng)執(zhí)行了reload(sys)以后,sys模塊的這三個(gè)變量將會(huì)被重置,導(dǎo)致輸出無(wú)法顯示在IDLE。

所以解決方案很簡(jiǎn)單,只需要在reload之前把這三個(gè)變量都復(fù)制一份,reload之后再恢復(fù)回來(lái)就行了:

解決方法2:python安裝目錄下的lib\site-packages文件夾下新建一個(gè)sitecustomize.py。 #推薦此方法

import sys
sys.setdefaultencoding('utf-8')

這樣在python文件中就不用在import模塊后添加

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

這兩句話了,也不用擔(dān)心print失效的問(wèn)題

補(bǔ)充知識(shí):Python IDLE reload(sys)后print無(wú)法正常執(zhí)行命令的原因

通常大多數(shù)人執(zhí)行reload(sys)這條語(yǔ)句其實(shí)僅僅是為了能夠修改Python的默認(rèn)字符集,也就是能夠調(diào)用sys.setdefaultencoding()。但是如果在IDLE中執(zhí)行reload(sys),就會(huì)導(dǎo)致接下來(lái)無(wú)法正常執(zhí)行任何命令。

起初遇到這個(gè)問(wèn)題也是束手無(wú)策,后來(lái)無(wú)意間在stackoverflow上看到有人說(shuō)到了這個(gè)問(wèn)題。原來(lái)是因?yàn)镮DLE作為一個(gè)GUI Shell環(huán)境,在啟動(dòng)初始化過(guò)程中,會(huì)設(shè)置特定的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,使得輸入和輸出都在IDLE的GUI Shell中,可以在IDLE中通過(guò)如下方式查看:

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

而如果手動(dòng)執(zhí)行了reload(sys)以后,sys模塊的這三個(gè)變量將會(huì)被重置,導(dǎo)致輸出無(wú)法顯示在IDLE。所以解決方案很簡(jiǎn)單,只需要在reload之前把這三個(gè)變量都復(fù)制一份,reload之后再恢復(fù)回來(lái)就行了:

>>> 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ì)心的人可能會(huì)想到,reload(sys)之后,如果標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都不起作用了,那么relaod(sys)后面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎么能夠執(zhí)行呢?所以其實(shí)reload(sys)之后、恢復(fù)之前,標(biāo)準(zhǔn)輸入還是可以正常工作的,可以通過(guò)如下代碼來(lái)檢驗(yà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> 
>>>  

所以問(wèn)題就解決了,但是必須要強(qiáng)調(diào):

千萬(wàn)不要輕易使用reload(sys),除非你完全清除這么做帶來(lái)的結(jié)果!僅僅為了能夠重新設(shè)定Python的默認(rèn)編碼就執(zhí)行reload(sys)更是非常不明智的行為!

Python的設(shè)計(jì)者故意在Python初始化完成以后刪除sys模塊里面的setdefaultencoding()方法,就是為了不讓在運(yùn)行時(shí)隨意更改Python默認(rèn)編碼,以免出現(xiàn)一些未知的問(wèn)題。事實(shí)上,關(guān)于編碼問(wèn)題,完全有別的更可靠的方法解決。

以上就是關(guān)于reload(sys)后print失效怎么辦的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI