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

摘要:
但是如果在IDLE中执行reload,就会导致接下来无法正常执行任何命令。仅仅为了能够重新设定Python的默认编码就执行reload更是非常不明智的行为!Python的设计者故意在Python初始化完成以后删除sys模块里面的setdefaultencoding()方法,就是为了不让在运行时随意更改Python默认编码,以免出现一些未知的问题。

转载自: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中通过如下方式查看:

  1. >>>importsys
  2. >>>printsys.stdin
  3. <idlelib.PyShell.PseudoInputFileobjectat0x00000000027AF2E8>
  4. >>>printsys.stdout
  5. <idlelib.PyShell.PseudoOutputFileobjectat0x00000000027AF320>
  6. >>>printsys.stderr
  7. <idlelib.PyShell.PseudoOutputFileobjectat0x00000000027AF358>
  8. >>>

而如果手动执行了reload(sys)以后,sys模块的这三个变量将会被重置,导致输出无法显示在IDLE。所以解决方案很简单,只需要在reload之前把这三个变量都复制一份,reload之后再恢复回来就行了:

  1. >>>stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr
  2. >>>reload(sys)
  3. >>>sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde
  4. >>>printsys.stdout
  5. <idlelib.PyShell.PseudoOutputFileobjectat0x00000000027AF320>
  6. >>>

细心的人可能会想到,reload(sys)之后,如果标准输入、标准输出和标准错误输出都不起作用了,那么relaod(sys)后面那一句sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde怎么能够执行呢?所以其实reload(sys)之后、恢复之前,标准输入还是可以正常工作的,可以通过如下代码来检验:

  1. >>>reload(sys)
  2. >>>sys.stdout=stdo
  3. >>>printsys.stdin
  4. <openfile'<stdin>',mode'r'at0x0000000001CAB030>
  5. >>>printsys.stdout
  6. <idlelib.PyShell.PseudoOutputFileobjectat0x00000000027AF320>
  7. >>>printsys.stderr
  8. <openfile'<stderr>',mode'w'at0x0000000001CAB150>
  9. >>>

所以问题就解决了,但是必须要强调:

千万不要轻易使用reload(sys),除非你完全清除这么做带来的结果!仅仅为了能够重新设定Python的默认编码就执行reload(sys)更是非常不明智的行为!

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

免责声明:文章转载自《关于Python IDLE reload(sys)后无法正常执行命令的原因》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ROS4 : ROS节点和主题Oracle连接字符串大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python 爬虫实战—盘搜搜

近期公司给了个任务:根据关键搜索百度网盘共享文件并下载。 琢磨了几天写下了一段简单的demo代码,后期优化没有处理。 主要的思路:(1)根据关键字爬取盘搜搜的相关信息       (2)解析并获取盘搜搜跳转到百度网盘的URL地址       (3)解析百度网盘获取真实下载URL然后下载文件 本来下了一段ip代理处理的, 可惜免费爬取的IP时效性差基本上用不...

算法导论 第十三章 红黑树(python)-1插入

红黑树是上一章二叉搜索树的改进,实现一种平衡 ,保证不会出现二叉树变链表的情况,基本动态集合操作的时间复杂度为O(lgn) 实际用途:c++stl中的set,map是用他实现的 红黑树的性质: 1.每个结点或是红色的,或是黑色的 2.跟结点是黑色的 3.每个叶结点(NIL)是黑色 4.如果一个结点是红色的,则它的两个结点都是黑色的 5.对每个结点,从该结点...

centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′

原文连接: http://blog.csdn.net/jaket5219999/article/details/53512071 系统red hat6.7 也即centos6.7 python3.5.2 安装 django 之后 创建project 以及 import sqlite3 都出现  No module named ‘_sqlite3′  >...

CentOS7彻底卸载Erlang和RabbitMQ

CentOS7卸载Erlang和RabbitMQ # 卸载erlang yum list | grep erlang yum -y remove erlang-* rm -rf /usr/lib64/erlang # 卸载RabbitMQ yum list | grep rabbitmq yum -y remove rabbitmq-server.no...

[Python之路] 使用epoll实现高并发HTTP服务器

什么是epoll 我们在  Python多种方式实现并发的Web Server 的最后使用单进程+单线程+非阻塞+长连接实现了一个可并发处理客户端连接的服务器。他的原理可以用以下的图来描述: 解释: 1.HTTP服务器是我们使用 单进程+单线程+非阻塞+长连接实现 的web服务器。 2.在实现的时候,我们创建了一个存放已接受Socket连接的列表,该列表...

Python数据分析丨numpy基本操作,了解一下?

一个栗子 1 >>>import numpy as np 2 3 >>>a = np.arange(15).reshape(3, 5) 4 5 >>>a 6 7 array([[ 0, 1, 2, 3, 4], 8 9 [5, 6, 7, 8, 9],...