解决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构建Hopfield网络的教程
Apr 14 Python
在Python中使用模块的教程
Apr 27 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
自定义django admin model表单提交的例子
Aug 23 Python
python yield关键词案例测试
Oct 15 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
python中提高pip install速度
Feb 14 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 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 数组排序方法总结 推荐收藏
2010/06/30 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
ThinkPHP模板判断输出Empty标签用法详解
2014/06/30 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
python如何实现excel数据添加到mongodb
2015/07/30 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
python编程实现希尔排序
2017/04/13 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
建筑设计学生的自我评价
2014/01/16 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
志愿者活动总结
2014/04/28 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
就业协议书怎么填
2014/09/15 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
2014年管理工作总结
2014/11/22 职场文书
会计工作岗位职责
2015/02/03 职场文书
学风建设主题班会
2015/08/17 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python
java项目构建Gradle的使用教程
2022/03/24 Java/Android