Python IDLE reload(sys)后print无法正常执行命令的原因
来源:互联网 发布:衣服淘宝店铺怎么描述 编辑:程序博客网 时间:2024/04/29 09:19
通常大多数人执行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默认编码,以免出现一些未知的问题。事实上,关于编码问题,完全有别的更可靠的方法解决。
- Python IDLE reload(sys)后print无法正常执行命令的原因
- Python IDLE reload(sys)后无法正常执行命令的原因
- Python IDLE reload(sys)后无法正常执行命令的原因
- 【笔记】关于python自带解释器reload(sys)后无法正常执行
- python reload sys 后才能setdefaultencoding 的原因
- 使用Python IDLE编写程序后无法保存的原因。
- Python的IDLE无法正常启动
- python保存文件UnicodeEncodeError以及reload(sys)后print失效问题
- python保存文件UnicodeEncodeError以及reload(sys)后print失效问题
- python2.7在使用reload(sys)后,再使用print语句无输出的解决办法
- Window下python2.7在使用reload(sys)后,再使用print语句无输出的解决方法
- Python - reload(sys) + sys.setdefaultencoding
- python安装后无法使用idle
- python为什么需要reload(sys)后设置编码
- python为什么需要reload(sys)后设置编码
- python2.7在使用reload(sys)后,再使用print语句无输出,有解决办法吗?
- PlayFrameWork2eclipse命令无法执行的原因
- python IDLE的执行py文件
- 1007. To and Fro
- win7 删除右下角的win10升级提示
- 类似滑动苹果解锁Text
- 灯光探测器 Light Probes
- 酷欧天气开发笔记3:显示天气信息
- Python IDLE reload(sys)后print无法正常执行命令的原因
- 虚拟地址的映射建立
- 交通序列号 简单DP
- text-align:center 和margin:0 auto的区别
- iOS进阶5--使用Jenkins搭建持续集成打包平台
- 开始我的代码博客
- 【解决】UART问题
- 流式布局的实现
- Unity中的优化技术