python中popen返回值_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.arch.rpm'
try:
cmd_args        = ['rpm', '-qip', MY_RPM_FILE_PATH]
infos          = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).adlines()
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.arch.rpm'
try:
cmd_args        = ['rpm', '-qip', MY_RPM_FILE_PATH]
infos          = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).adlines()
python中文文档
unicode_text    = u''
for line in infos:
unicode_text = unicode_text + de('utf-8')
print unicode_text
except Exception, _ex:
print 'ERROR: %s' % str(_ex)
但是经过转换后,代码运⾏报错和先前⼀样,经过分析,在执⾏下⾯代码时,问题就已经发⽣:
infos          = subprocess.Popen(cmd_args, stdout=subprocess.PIPE, shell=False).adlines()
那么现在问题就定位到如何让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.arch.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).adlines()
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,导致我调试发送邮件时浪费了不少时间。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。