Python IDLE reload(sys)后无法正常执行命令的原因

通常大多数人执行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默认编码,以免出现一些未知的问题。事实上,关于编码问题,完全有别的更可靠的方法解决。

时间: 2024-08-28 03:20:32

Python IDLE reload(sys)后无法正常执行命令的原因的相关文章

(转载)Python IDLE reload(sys)后无法正常执行命令的原因

通常大多数人执行reload(sys)这条语句其实仅仅是为了能够修改Python的默认字符集,也就是能够调用sys.setdefaultencoding().但是如果在IDLE中执行reload(sys),就会导致接下来无法正常执行任何命令. 起初遇到这个问题也是束手无策,后来无意间在stackoverflow上看到有人说到了这个问题.原来是因为IDLE作为一个GUI Shell环境,在启动初始化过程中,会设置特定的标准输入.标准输出和标准错误输出,使得输入和输出都在IDLE的GUI Shell

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') 操

python reload(sys) 后无法输出

重新加载sys后,在idle里无法输出内容.出现这种情况,需要将sys的三个变量重新定义. 在重新载入sys之前,为三个变量赋值 a,b,c = sys.studin,sys.studout,sys.studerr 然后重新载入sys reload(sys) 在为sys的三个变量赋值 sys.studin,sys.studout,sys.studerr = a,b,c 这样就解决了...

python reload(sys)后不打印解决

import sys stdout = sys.stdout reload(sys) sys.stdout = stdout

python中reload(sys)作用

python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128),python没办法处理非ascii编码的,此时需要自己设置python的默认编码,一般设置为utf8的编码格式. 在程序中加入以下代码:即可将编码设置为utf8import sysreload(sy

第67天python学习基于tcp实例化实现远程执行命令

使用管道实现2个程序之间通信:例如:QQ  和微信通信 服务端: from socket import *import subprocess #管道模块,不同程序之间通信ip_port="127.0.0.1",8080back_log=5buffer_size=1024 tcp_server=socket(AF_INET,SOCK_STREAM)tcp_server.bind(ip_port)tcp_server.listen(5)while True: conn,addr=tcp_s

Nodejs安装完成后,并执行命令出现版本号,但是无法执行测试js

第一步:下载nodejs并安装 下载地址:https://nodejs.org/en/ 可安装在其他盘. 第二步:配置环境变量 一个是PATH上增加node.exe的目录D:\\nodejs 一个是增加环境变量NODE_PATH,值为D:\\nodejs\\node_modules. 第三步:安装express 打开cmd命令行,使用命令行定位到这Node目录下,键入指令npm install express[安装express至相对路径]或npm install express -g[安装ex

Python reload(sys)找不到,name &#39;reload&#39; is not defined

sys.setdefaultencoding("utf-8") 这种方式在3.x中被彻底遗弃,可以看看stackover的这篇文章: http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script Python reload(sys)找不到,name 'reload' is not defined

python reload(sys)找不到,name &#39;reload&#39; is not defined和Python3异常-AttributeError: module &#39;sys&#39; has no att

基于python3.6.1版本,在一个.py文件中,加入这3行:import requests, re, sysreload(sys)sys.setdefaultencoding("utf-8") 出现这样的错误:sys.setdefaultencoding("utf-8")AttributeError: module 'sys' has no attribute 'setdefaultencoding' 原因分析:Python3字符串默认编码unicode, 所以