如何转换subprocess.Popen()返回的字符串的编码?

时间:2018-12-28 23:02:55

标签: python string character-encoding decode encode

我正在尝试使用subprocess.Popen()执行命令,并使用以下代码提取结果。

proc = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
gadgets = out.split('\n')

结果是一个字符串,可以根据结果中的换行符进行拆分,从而将其拆分为多行。为简单起见,我们假设代码片段中的gadgets变量是两个字符串的列表。当我使用python print()函数在控制台上从列表中打印单个项目时,我得到的普通ascii文本如下。

for item in gadgets:
    print(item)

输出:

syscall; 
xlatb; ret;

但是,当我打印列表时,我得到了另一种字符。输出如下:

print(gadgets)

输出:

['\x1b[1;33msyscall\x1b[0m\x1b[1;34m; \x1b[0m', '\x1b[1;33mxlatb\x1b[0m\x1b[1;34m; \x1b[0m\x1b[1;33mret\x1b[0m\x1b[1;34m; \x1b[0m']

我相信print()函数会以某种方式更改编码并在控制台上为单个项目打印正常的ascii文本。在这种情况下,谁能告诉我print()函数使用哪种编码?谢谢!

1 个答案:

答案 0 :(得分:0)

第二个输出具有用于颜色的ANSI转义字符。从第二个输出中删除ANSI转义字符将提供第一个输出。

此链接[https://stackoverflow.com/a/14693789/3114833]描述了删除ANSI转义字符的方法。从链接复制了以下代码。

import re

ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
ansi_escape.sub('', sometext)