1. 程式人生 > 程式設計 >解決reload(sys)後print失效的問題

解決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.stderr=stdi,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,sys.stderr 
>>> reload(sys) 
>>> sys.stdin,stde 
>>> print sys.stdout 
<idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320> 
>>>

細心的人可能會想到,reload(sys)之後,如果標準輸入、標準輸出和標準錯誤輸出都不起作用了,那麼relaod(sys)後面那一句sys.stdin,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失效的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。