解决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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
python在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
12步教你理解Python装饰器
Feb 25 Python
详解Python函数作用域的LEGB顺序
May 14 Python
Python中的descriptor描述器简明使用指南
Jun 02 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
Python实现XML文件解析的示例代码
Feb 05 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
Python模块、包(Package)概念与用法分析
May 31 Python
Python3分析处理声音数据的例子
Aug 27 Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 Python
python pandas移动窗口函数rolling的用法
Feb 29 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
QueryPath PHP 中的jQuery
2010/04/11 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
大学生求职简历的自我评价
2013/10/21 职场文书
大学生怎样进行自我评价
2013/12/07 职场文书
幼儿教师研修感言
2014/02/12 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
php png失真的原因及解决办法
2021/10/24 PHP