Юникод Python и ошибка \ xe2 \ x80 \ x98r \ xe2 \ x80 \ x99 - PullRequest
0 голосов
/ 25 мая 2018

Python версия 3.5.2

Итак, у меня есть вывод файла из mitmproxy с именем 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')

, и она отлично работает !.возвращение:

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

Так в чем же решение?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я почти уверен, что ваша команда не транслируется, как вы могли ожидать при вызове g.run - аргументы -n -r после mitmdump каким-то образом передаются tail, таким образом выполняя:

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

Создайте то сообщение об ошибке, которое вы видите.

Теперь, когда вы сообщите нам, что на самом деле означает g.run, взглянув на документацию для функции, которую мы видим, что она принимаетshell аргумент, который передается Popen, который является аргументом для включения обработки команд оболочки.Чтобы решить эту проблему, вы можете попробовать следующее:

p = g.run(command, shell=True)
0 голосов
/ 25 мая 2018

Данные возвращаются в байтах, как указано b в фронте вывода.Вы должны декодировать его в строку.

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

...