解决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 06 Python
使用Python写个小监控
Jan 27 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
Python装饰器用法实例总结
May 26 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
Python计算IV值的示例讲解
Feb 28 Python
python实现无边框进度条的实例代码
Dec 30 Python
python如何读取.mtx文件
Apr 22 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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
用PHP将数据导入到Foxmail
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
如何隐藏你的.php文件
2007/01/04 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
python简单实现刷新智联简历
2016/03/30 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
Python3常见函数range()用法详解
2019/12/30 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
python使用smtplib模块发送邮件
2020/12/17 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
证婚人经典证婚词
2014/01/09 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
关于召开会议的通知
2015/04/15 职场文书
歌舞青春观后感
2015/06/10 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
python装饰器代码解析
2022/03/23 Python