解决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 文件与目录操作
Dec 24 Python
python文件写入实例分析
Apr 08 Python
python实现清屏的方法
Apr 30 Python
小米5s微信跳一跳小程序python源码
Jan 08 Python
python如何实现int函数的方法示例
Feb 19 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
python中bytes和str类型的区别
Oct 21 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
tensorflow 环境变量设置方式
Feb 06 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 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+MySQL 制作简单的留言本
2009/11/02 PHP
php防止sql注入的方法详解
2017/02/20 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
jquery延迟对象解析
2016/10/26 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
python编程嵌套函数实例代码
2018/02/11 Python
Python入门学习指南分享
2018/04/11 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
电子信息专业学生自荐信
2013/11/09 职场文书
小区停车场管理制度
2014/01/27 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
离婚答辩状范文
2015/05/22 职场文书
单独二胎证明
2015/06/24 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python