OpenStack某些命令使用grep过滤报错
这里写自定义目录标题
OpenStack某些命令使用grep过滤报错
OpenStack后台使用某些命令的时候,比如glance image-list |grep xxx、neutron xxx-list |grep xxx的时候,报错“‘ascii’ codec can’t encode characters in position 2689-2698: ordinal not in range(128)”
报错原因
Python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x?? in position 1: ordinal not in range(128),因此python没办法处理非ascii编码,此时需要重新设置python的默认编码,一般设置为utf8的编码格式。
查看系统当前的Python编码,可以按照如下方式:
1、直接输入“python”命令(针对Python2.x),进入Python命令行;
2、在Python命令行,输入以下命令导入sys:
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
3、最后输入命令“sys.getdefaultencoding()”即可查询到当前Python环境的默认编码:
>>> sys.getdefaultencoding()
'utf8'
总体步骤示例如下图:
解决方案
方案一:用函数sys.setdefaultencoding()临时修改编码
1、直接输入“python”进入Python命令行;
2、分别输入“import sys”、“reload(sys)”导入sys;
3、输入“sys.setdefaultencoding(‘utf8’)”设置默认编码为utf8;
[root@node-1 ~]# python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'ascii'
>>> sys.setdefaultencoding('utf8')
>>> sys.getdefaultencoding()
'utf8'
>>> exit()
此时在执行sys.getdefaultencoding()就会发现编码已经被设置为utf8的了,但是在解释器里修改的编码只能保证当次有效,在重启解释器后,会发现,编码又被重置为默认的ascii了。
此时可以按照方案二永久修改python编码为utf8.
方案二:创建sitecustomize.py文件永久修改编码
1、进入python的默认lib库
[root@node-1 ~]# cd /lib/python2.7/site-packages/
[root@node-1 site-packages]# pwd
/lib/python2.7/site-packages
[root@node-1 site-packages]#
2、创建文件sitecustomize.py
[root@node-1 site-packages]# vim sitecustomize.py
3、在文件sitecustomize.py中添加以下内容
import sys
reload(sys)
sys.setdefaultencoding('utf8')
wq保存退出。
此时再重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同。这是因为系统在python启动的时候,会自行调用sitecustomize.py这个文件,来设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。
再次使用grep命令过滤,即可正常显示结果。
本文地址:https://blog.csdn.net/weixin_38179166/article/details/107407328
下一篇: 读MySQL技术内幕 事物笔记