日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2025/3/21 linux 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中popen汉字乱码,Python中使用subprocess.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.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,導致我調試發送郵件時浪費了不少時間。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。