Python中使用subprocess.Popen返回值乱码解决措施
发布时间:2021-11-21 17:03:54 所属栏目:PHP教程 来源:互联网
导读:问题描述 在Python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值格式化成utf-8格式,但是对于返回值出现中文时,会造成转码错误,具体情况如下: # -*- coding: utf-8 -*- import subprocess MY_RPM_FILE_PATH = /home
问题描述 在Python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值格式化成utf-8格式,但是对于返回值出现中文时,会造成转码错误,具体情况如下: # -*- coding: utf-8 -*- import subprocess MY_RPM_FILE_PATH = '/home/dongliang.ma/rpmbuild/RPMS/noarch/q-yumtools-server-1.1.0-1.el6.noarch.rpm' try: cmd_args = ['rpm', '-qip', MY_RPM_FILE_PATH] infos = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).stdout.readlines() unicode_text = u''.join(infos) print unicode_text except Exception, _ex: print 'ERROR: %s' % str(_ex) 问题分析 从python的报错来看,是中文编码超出了ASCII码的表示范围,具体报错的代码为: unicode_text = u''.join(infos) 既然是无法表示,我的第一反应就是进行转码,于是将代码改写: # -*- coding: utf-8 -*- import subprocess MY_RPM_FILE_PATH = '/home/dongliang.ma/rpmbuild/RPMS/noarch/q-yumtools-server-1.1.0-1.el6.noarch.rpm' try: cmd_args = ['rpm', '-qip', MY_RPM_FILE_PATH] infos = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).stdout.readlines() unicode_text = u'' for line in infos: unicode_text = unicode_text + line.encode('utf-8') print unicode_text except Exception, _ex: print 'ERROR: %s' % str(_ex) 但是经过转换后,代码运行报错和先前一样,经过分析,在执行下面代码时,问题就已经发生: infos = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).stdout.readlines() 那么现在问题就定位到如何让infos这个变量能够存储中文,经过查阅文档,发现python有一个defaultencoding的概念,即默认使用的编码,只要将这个属性设置为utf-8,那么就可以正确存储中文,其具体设置方法是使用: reload(sys) sys.setdefaultencoding('utf-8') 经过上述设置后,即可正确处理中文信息。 最终方案 # -*- coding: utf-8 -*- import sys import subprocess MY_RPM_FILE_PATH = '/home/dongliang.ma/rpmbuild/RPMS/noarch/q-yumtools-server-1.1.0-1.el6.noarch.rpm' try: reload(sys) sys.setdefaultencoding('utf-8') cmd_args = ['rpm', '-qip', MY_RPM_FILE_PATH] infos = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).stdout.readlines() unicode_text = u''.join(infos) print unicode_text except Exception, _ex: print 'ERROR: %s' % str(_ex) 运行结果: 总结 python默认使用的编码是ASCII,这会导致国际化的问题,一个比较好的做法是,在程序运行时,将默认编码修改为utf-8; 在python源文件中使用unicode字符时,一定要将python文件保存为utf-8格式,而不是仅仅在开头加上# -*- coding: utf-8 -*-这个bug,导致我调试发送邮件时浪费了不少时间。 ![]() (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |