解决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 ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
详解js文件通过python访问数据库方法
Mar 03 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
Python3进制之间的转换代码实例
Aug 24 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
最小二乘法及其python实现详解
Feb 24 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
pyqt5打包成exe可执行文件的方法
May 14 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
Node.js事件驱动
2015/06/18 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
Python中的集合类型知识讲解
2015/08/19 Python
Python 私有函数的实例详解
2017/09/11 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
体育教师自我鉴定
2014/02/12 职场文书
服务标语大全
2014/06/18 职场文书
民事和解协议书格式
2014/11/29 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python