關於Python IDLE reload(sys)後沒法正常執行命令的緣由

轉載自:http://blog.csdn.net/kxcfzyk/article/details/41414247?utm_source=tuicool&utm_medium=referralpython

 

 

一般大多數人執行reload(sys)這條語句其實僅僅是爲了可以修改Python的默認字符集,也就是可以調用sys.setdefaultencoding()。可是若是在IDLE中執行reload(sys),就會致使接下來沒法正常執行任何命令。ui

 

起初遇到這個問題也是一籌莫展,後來無心間在stackoverflow上看到有人說到了這個問題。原來是由於IDLE做爲一個GUI Shell環境,在啓動初始化過程當中,會設置特定的標準輸入、標準輸出和標準錯誤輸出,使得輸入和輸出都在IDLE的GUI Shell中,能夠在IDLE中經過以下方式查看:編碼

[python]  view plain  copy
 
  1. >>> import sys  
  2. >>> print sys.stdin  
  3. <idlelib.PyShell.PseudoInputFile object at 0x00000000027AF2E8>  
  4. >>> print sys.stdout  
  5. <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
  6. >>> print sys.stderr  
  7. <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF358>  
  8. >>>   

 

而若是手動執行了reload(sys)之後,sys模塊的這三個變量將會被重置,致使輸出沒法顯示在IDLE。因此解決方案很簡單,只須要在reload以前把這三個變量都複製一份,reload以後再恢復回來就好了:spa

[python]  view plain  copy
 
  1. >>> stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr  
  2. >>> reload(sys)  
  3. >>> sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde  
  4. >>> print sys.stdout  
  5. <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
  6. >>>   

 

細心的人可能會想到,reload(sys)以後,若是標準輸入、標準輸出和標準錯誤輸出都不起做用了,那麼relaod(sys)後面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎麼可以執行呢?因此其實reload(sys)以後、恢復以前,標準輸入仍是能夠正常工做的,能夠經過以下代碼來檢驗:.net

[python]  view plain  copy
 
  1. >>> reload(sys)  
  2. >>> sys.stdout=stdo  
  3. >>> print sys.stdin  
  4. <open file '<stdin>', mode 'r' at 0x0000000001CAB030>  
  5. >>> print sys.stdout  
  6. <idlelib.PyShell.PseudoOutputFile object at 0x00000000027AF320>  
  7. >>> print sys.stderr  
  8. <open file '<stderr>', mode 'w' at 0x0000000001CAB150>  
  9. >>>   

 

因此問題就解決了,可是必需要強調:設計

 

千萬不要輕易使用reload(sys),除非你徹底清除這麼作帶來的結果!僅僅爲了可以從新設定Python的默認編碼就執行reload(sys)更是很是不明智的行爲!blog

 

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

相關文章
相關標籤/搜索