解决reload(sys)后print失效的问题


Posted in Python onApril 25, 2020

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

操作如下:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
>>> sys.setdefaultencoding('utf-8')
>>> tmp = ('中国','英国')
>>> tmp
>>> print tmp
>>>

如上面的操作所示:设置python编码格式后,print失效了,没有任何输出。

解决方法1: 在python代码中进行改变

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
#注意:使用此方式,有极大的可能导致print函数无法打印数据!

#改进方式如下:
import sys #这里只是一个对sys的引用,只能reload才能进行重新加载
stdi,stdo,stde=sys.stdin,sys.stdout,sys.stderr 
reload(sys) #通过import引用进来时,setdefaultencoding函数在被系统调用后被删除了,所以必须reload一次
sys.stdin,sys.stdout,sys.stderr=stdi,stdo,stde 
sys.setdefaultencoding('utf-8')

说明:手动执行了reload(sys)以后,sys模块的这三个变量将会被重置,导致输出无法显示在IDLE。

所以解决方案很简单,只需要在reload之前把这三个变量都复制一份,reload之后再恢复回来就行了:

解决方法2:python安装目录下的lib\site-packages文件夹下新建一个sitecustomize.py。 #推荐此方法

import sys
sys.setdefaultencoding('utf-8')

这样在python文件中就不用在import模块后添加

reload(sys)
sys.setdefaultencoding('utf8')

这两句话了,也不用担心print失效的问题

补充知识:Python IDLE reload(sys)后print无法正常执行命令的原因

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

以上这篇解决reload(sys)后print失效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中利用函数装饰器实现备忘功能
Mar 30 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Python编程实现使用线性回归预测数据
Dec 07 Python
django实现用户登陆功能详解
Dec 11 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python内置数据类型之列表操作
Nov 12 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
Python基础之pandas数据合并
Apr 27 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 #Python
500行python代码实现飞机大战
Apr 24 #Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 #Python
Python3实现飞机大战游戏
Apr 24 #Python
python实现飞船游戏的纵向移动
Apr 24 #Python
python实现俄罗斯方块小游戏
Apr 24 #Python
iPython pylab模式启动方式
Apr 24 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
基于mysql的bbs设计(五)
2006/10/09 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
小程序组件之自定义顶部导航实例
2019/06/12 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
详解Python 定时框架 Apscheduler原理及安装过程
2019/06/14 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
CAD制图人员的自荐信
2014/02/07 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
大学生评语大全
2014/04/18 职场文书
大学生标准自荐书
2014/06/15 职场文书
记账会计岗位职责
2014/06/16 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
Python实现抖音热搜定时爬取功能
2022/03/16 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸