解决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开发windows GUI程序入门实例
Oct 23 Python
详解在Python和IPython中使用Docker
Apr 28 Python
在Python中的Django框架中进行字符串翻译
Jul 27 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
python制作小说爬虫实录
Aug 14 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
django框架自定义用户表操作示例
Aug 07 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
PHP制作图型计数器的例子
2006/10/09 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
Python创建模块及模块导入的方法
2015/05/27 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
恶意软件的定义
2014/11/12 面试题
如何清空Session
2015/02/23 面试题
员工年终演讲稿
2014/01/03 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
物业管理交接协议书
2016/03/24 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
Python+tkinter实现高清图片保存
2022/03/13 Python
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL