解决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登录Dr.com思路以及代码分享
Jun 25 Python
详解Python中的条件判断语句
May 14 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
python中比较两个列表的实例方法
Jul 04 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Python八皇后问题解答过程详解
Jul 29 Python
适合Python初学者的一些编程技巧
Feb 12 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
python实现简单区块链结构
Apr 25 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模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
利用Python开发实现简单的记事本
2016/11/15 Python
python3爬虫之设计签名小程序
2018/06/19 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
Python新手学习raise用法
2020/06/03 Python
Python二元算术运算常用方法解析
2020/09/15 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
人事助理岗位职责
2013/11/18 职场文书
幼儿园小班评语
2014/04/18 职场文书
演讲开场白和结束语
2015/05/29 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
MySQL数据迁移相关总结
2021/04/29 MySQL
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL