设为首页 加入收藏

TOP

Python中使用subprocess.Popen返回值乱码解决方案
2014-11-24 07:15:00 来源: 作者: 【 】 浏览:0
Tags:Python 使用 subprocess.Popen 返回 乱码 解决方案

问题描述


在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,导致我调试发送邮件时浪费了不少时间。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 实现GridView多选效果【.. 下一篇shell中变量的测试与替换

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·工业机器人TCP校准中 (2025-12-25 05:19:17)
·opc 通讯协议与 TCP (2025-12-25 05:19:15)
·labview中tcp/ip通信 (2025-12-25 05:19:13)
·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)