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

Python Unicode和\xe2\x80\x98r\xe2\x80\x99错误,python,unicode,character-encoding,Python,Unicode,Character Encoding,Python版本3.5.2 因此,我有来自mitmproxy的文件输出,名为entercode 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

Python版本3.5.2

因此,我有来自
mitmproxy
的文件输出,名为
entercode 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')
而且效果很好!。返回:

data:b'64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.056 ms\n'

那么解决方案是什么呢?

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


print(“数据:“+line.decode('utf-8')+'\n\n')
我很确定调用
g.run
时,您的命令没有像您预期的那样被管道传输,
mitmdump
之后的参数
-n-r
以某种方式被传递到
tail
,因此运行此:

$ tail -n -r
tail: invalid number of lines: ‘r’
生成您看到的错误消息

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

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

你试过在脚本文件的顶部添加“#--coding:utf-8--”吗?我已经试过添加“#--coding:utf-8--”,但同样的错误@LISHITINGSo,你到底在问什么?为什么您的命令
tail-f-c+0输出_文件| mitmdump-n-r---set flow_detail=1--showhost
不能按预期工作,以及如何修复它?因为输出的编码对您来说似乎并不像问题从我的角度所暗示的那样是一个问题view@LISHITING该声明仅声明源文件的编码。如果源文件都是ASCII码(如图所示),则没有区别。错误再次出现。。并返回
tail:行数无效:“r”
yes。这是命令行上的命令产生的错误。它与python无关。另外,请参阅metatoaster对此的回答哦,对不起,我更新了代码。我遵循了来自的教程:当您直接从Python外部的命令行运行命令时,屏幕上会打印任何内容吗?然后它会以完全相同的方式工作。您确定正在使用数据写入
output\u文件
?运行
tail-f output\u file
提供了什么?我确信
output\u file
中有数据。如果我将命令更改为
tail-f-c+0output_file
并更改
shell=False
,它将打印与
tail-f output_file
相同的二进制文本。而不是通过管道传输到
mitmdump
,而是通过管道传输到像
cat
这样的中性对象,并查看它在Python代码中的工作方式是否与在命令行中的工作方式相同。