手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Python中使用subprocess.Popen返回值乱码解决方案

[日期:2013-05-29] 来源:CSDN  作者:马冬亮 [字体: ]

问题描述

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

linux
相关资讯       Python乱码 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款