zoukankan      html  css  js  c++  java
  • 关于Python IDLE reload(sys)后无法正常执行命令的原因

    转载自:http://blog.csdn.net/kxcfzyk/article/details/41414247?utm_source=tuicool&utm_medium=referral

    通常大多数人执行reload(sys)这条语句其实仅仅是为了能够修改Python的默认字符集,也就是能够调用sys.setdefaultencoding()。但是如果在IDLE中执行reload(sys),就会导致接下来无法正常执行任何命令。

    起初遇到这个问题也是束手无策,后来无意间在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之后再恢复回来就行了:

    [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)之后、恢复之前,标准输入还是可以正常工作的,可以通过如下代码来检验:

    [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)更是非常不明智的行为!

    Python的设计者故意在Python初始化完成以后删除sys模块里面的setdefaultencoding()方法,就是为了不让在运行时随意更改Python默认编码,以免出现一些未知的问题。事实上,关于编码问题,完全有别的更可靠的方法解决。

  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/saolv/p/8178693.html
Copyright © 2011-2022 走看看