Python Unicode和\ xe2 \ x80 \ x98r \ xe2 \ x80 \ x99错误

时间:2018-05-25 06:08:02

标签: python unicode character-encoding

  

Python版本3.5.2

所以我有来自mitmproxy的{​​{1}}文件输出,我想用以下方式阅读:

enter code here

并返回

from shelljob import proc

g = proc.Group()
command = "tail -f -c +0 output_file | mitmdump -n -r - --set flow_detail=1 --showhost"
p = g.run (command)

def read_process():
    while g.is_pending():
        lines = g.readlines()
        for proc, line in lines:
            print ("data:" + str(line) + '\n\n')

但如果我将命令更改为data:b'tail: invalid number of lines: \xe2\x80\x98r\xe2\x80\x99\n' ,例如:

ping 127.0.0.1

它工作正常!返回:

from shelljob import proc

g = proc.Group()
command = "ping 127.0.0.1"
p = g.run (command)

def read_process():
    while g.is_pending():
        lines = g.readlines()
        for proc, line in lines:
            print ("data:" + str(line) + '\n\n')

那么解决方案是什么?

2 个答案:

答案 0 :(得分:0)

数据以字节为单位返回,如输出中的b所示。 你必须将它解码为一个字符串。

print ("data:" + line.decode('utf-8') + '\n\n')

答案 1 :(得分:0)

我非常确定您的命令不会像调用g.run时所预期的那样被管道传输 - -n -r之后的参数mitmdump以某种方式传递给tail因此运行:

$ tail -n -r
tail: invalid number of lines: ‘r’

生成您看到的错误消息。

现在您告诉我们g.run实际上是什么,查看函数的documentation,我们可以看到它传递给Popenshell参数,这是启用shell命令处理的参数。要解决此问题,您可以尝试以下方法:

p = g.run(command, shell=True)