中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

reload(sys)后print失效怎么辦

發布時間:2020-07-30 14:49:06 來源:億速云 閱讀:173 作者:小豬 欄目:開發技術

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

python版本: python2.7.6

#查看python默認編碼格式

>>> import sys
>>> print sys.getdefaultencoding() #python 2.x 默認編碼是ascii格式; python 3.x 默認編碼是utf-8格式
ascii
#設置python默認的編碼格式

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

操作如下:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
>>> sys.setdefaultencoding('utf-8')
>>> tmp = ('中國','英國')
>>> tmp
>>> print tmp
>>> 

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

解決方法1: 在python代碼中進行改變

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

#改進方式如下:
import sys #這里只是一個對sys的引用,只能reload才能進行重新加載
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr 
reload(sys) #通過import引用進來時,setdefaultencoding函數在被系統調用后被刪除了,所以必須reload一次
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 
sys.setdefaultencoding('utf-8')

說明:手動執行了reload(sys)以后,sys模塊的這三個變量將會被重置,導致輸出無法顯示在IDLE。

所以解決方案很簡單,只需要在reload之前把這三個變量都復制一份,reload之后再恢復回來就行了:

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

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

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

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

這兩句話了,也不用擔心print失效的問題

補充知識:Python IDLE reload(sys)后print無法正常執行命令的原因

通常大多數人執行reload(sys)這條語句其實僅僅是為了能夠修改Python的默認字符集,也就是能夠調用sys.setdefaultencoding()。但是如果在IDLE中執行reload(sys),就會導致接下來無法正常執行任何命令。

起初遇到這個問題也是束手無策,后來無意間在stackoverflow上看到有人說到了這個問題。原來是因為IDLE作為一個GUI Shell環境,在啟動初始化過程中,會設置特定的標準輸入、標準輸出和標準錯誤輸出,使得輸入和輸出都在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> 
>>>  

而如果手動執行了reload(sys)以后,sys模塊的這三個變量將會被重置,導致輸出無法顯示在IDLE。所以解決方案很簡單,只需要在reload之前把這三個變量都復制一份,reload之后再恢復回來就行了:

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

細心的人可能會想到,reload(sys)之后,如果標準輸入、標準輸出和標準錯誤輸出都不起作用了,那么relaod(sys)后面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎么能夠執行呢?所以其實reload(sys)之后、恢復之前,標準輸入還是可以正常工作的,可以通過如下代碼來檢驗:

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

所以問題就解決了,但是必須要強調:

千萬不要輕易使用reload(sys),除非你完全清除這么做帶來的結果!僅僅為了能夠重新設定Python的默認編碼就執行reload(sys)更是非常不明智的行為!

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通江县| 安庆市| 个旧市| 仪陇县| 永吉县| 赤水市| 平果县| 洛南县| 亚东县| 正安县| 新泰市| 定南县| 旬邑县| 新邵县| 界首市| 赤壁市| 辽源市| 体育| 仁怀市| 上栗县| 南宫市| 卢氏县| 威海市| 海南省| 蛟河市| 蓬莱市| 岳普湖县| 武陟县| 台东市| 永修县| 璧山县| 赤水市| 临泽县| 府谷县| 兴业县| 大关县| 西和县| 玉屏| 保山市| 成都市| 花垣县|