標籤:
通常大多數人執行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="">>>> </idlelib.pyshell.pseudooutputfile></idlelib.pyshell.pseudooutputfile></idlelib.pyshell.pseudoinputfile>
而如果手動執行了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="">>>> </idlelib.pyshell.pseudooutputfile>
細心的人可能會想到,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>>>> </open></idlelib.pyshell.pseudooutputfile></open>
所以問題就解決了,但是必須要強調:
千萬不要輕易使用reload(sys),除非你完全清除這麼做帶來的結果!僅僅為了能夠重新設定Python的預設編碼就執行reload(sys)更是非常不明智的行為!
Python的設計者故意在Python初始化完成以後刪除sys模組裡面的setdefaultencoding()方法,就是為了不讓在運行時隨意更改Python預設編碼,以免出現一些未知的問題。事實上,關於編碼問題,完全有別的更可靠的方法解決。
轉載自:Python IDLE reload(sys)後無法正常執行命令的原因 - Python開發技術文章_教程 - 紅黑聯盟 http://www.2cto.com/kf/201411/355112.html
(轉載)Python IDLE reload(sys)後無法正常執行命令的原因