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

linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案相关推荐

  1. Java Web项目中HTML文件中的汉字在浏览器中显示乱码的解决方案

    今天在做一个Java Web项目的时候,html中的汉字在浏览器中显示为乱码,分析其可能原因有: (1)html文件属性中有默认的编码方式,如果它的设置与html文档中content charset属 ...

  2. pythontkinter在一块区域中绘图_用Python中的tkinter模块作图(续)

    八.显示文字 用create_text在画布上写字.这个函数只需要两个坐标(文字x和y的位置),还有一个具名参数来接受要显示的文字.例如: >>> from tkinter impo ...

  3. python中readlines函数用法,python中read() readline()以及readlines()用法

    我们谈到"文本处理"时,我们通常是指处理的内容.Python 将文本文件的内容读入可以操作的字符串变量非常容易.文件对象提供了三个"读"方法: .read(). ...

  4. 【科学文献计量】将Endnote中的文献读入python中进行数据分析,并顺便将结果保存为Excel文件,并封装函数直接调用

    将Endnote中的文献读入python中进行数据分析,并顺便将结果保存为Excel文件 1 需求 2 功能完成 2.1 文献下载 2.2 文献导入到Endnote 2.3 文献导出 2.4 文件加载 ...

  5. python中的return函数-python中return的返回和执行

    1打印函数名和打印函数的执行过程的区别 例子1.1 defa():print(111)print(a) #打印a函数的内存地址,不会对a函数有影响,a函数不会执行 print(a()) #打印a函数的 ...

  6. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

    请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. 刚开始复习js题还不太习惯 CSDN上看了一个帖子,说是牛客上的标答, ...

  7. TabHost中使用startActivityForResult无法接收返回值的解决方案

    TabHost中使用startActivityForResult无法接收返回值的解决方案 参考文章: (1)TabHost中使用startActivityForResult无法接收返回值的解决方案 ( ...

  8. 关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13...

    为什么80%的码农都做不了架构师?>>>    关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13 现有功能: 以前版本仅支持自己定义url,返回 ...

  9. python程序捕获subprocess.Popen运行cmd命令的实时输出

    Python学习记录,如果帮到你,评论里鼓励一下(手动滑稽),谢谢. python程序捕获subprocess.Popen运行cmd命令的实时输出 概述 疑问 展望 概述 我使用python调用pyq ...

最新文章

  1. sendmail启动virtusertable.db错误解决
  2. 学习Spring Boot:(十)使用hibernate validation完成数据后端校验
  3. Zephyr内核到1.5版本的改进
  4. 通过加载 QSS 文件的方式美化 QT 界面
  5. String类型的认识以及编译器优化
  6. java国际化——资源包
  7. P1959 遗址_NOI导刊2009普及(6)
  8. python 自定义数据类型_【整理合集,建议收藏】Python数据类型(一)
  9. win server 缓冲区队列不足_有赞延迟队列设计
  10. 网恋奔现发现对方长得很好看是什么样的体验?
  11. 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
  12. 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板
  13. 第七次人口普查数据可视化---pyecharts
  14. 仿写京东登录页面HTML/CSS
  15. C++ 控制台编译时显示‘ ld returned 1 exit status’
  16. static taint IoT vul location
  17. 世界银行为孟加拉国建设数据中心提供贷款
  18. HTML——3D旋转+动画 旋转木马案例
  19. 使用 Entity Framework Power Tool 报错 0×80070057 解决方法
  20. 10个在线正则表达式测试网站推荐

热门文章

  1. MATLAB可视化实战系列(四十二)-图像特征提取-使用低秩 SVD 进行图像压缩实例
  2. 建议三连,数据分析师的年终述职报告,留给你的年终报告吧
  3. microsoft word中在公式后插入可交叉引用的公式编号
  4. Best practice for JVM Tuning[转]
  5. flink dataset api使用及原理
  6. 兼顾稳定和性能,58大数据平台的技术演进与实践
  7. 几张图帮你理解 docker 基本原理及快速入门
  8. nodejs安装node-rsa遇到的问题及解决
  9. 重磅更新!YoloV4最新论文与源码!权重!结构!翻译!
  10. MySQL-性能优化_影响MySQL性能的因素分析及解决方案