2015-08-07 1 views
1

Когда я запускаю этот код:Python: TypeError при поиске в строке

stdout = Popen(callbackquery, shell=True, stdout=PIPE).stdout 
    output = stdout.read() 
    if output.find("No records were found that matched the search criteria") == -1: 
     print(output) 
    else: 
     # Do nothing 
     print("It's fine") 

Я получаю следующее сообщение об ошибке:

if output.find("No records were found that matched the search criteria") == -1: 
TypeError: 'str' does not support the buffer interface 

Я понимаю, что это связано с кодировкой символов, но я не Не знаете, где и как мне нужно это преобразовать?

+0

Вы используете Python 2.x или 3? – ezig

+0

У вас ошибка в Google, а также «popen», «stdout.read» и т. Д.? Есть несколько существующих вопросов с ответами, которые могут вам помочь. – TigerhawkT3

+0

stdout = Popen (callbackquery, shell = True, stdout = PIPE, universal_newlines = True) .stdout output = stdout.read() –

ответ

0
stdout = Popen(callbackquery, shell=True, stdout=PIPE, universal_newlines=True).stdout 
    output = stdout.read() 
+2

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество своей должности. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

0
If "No records were found that matched the search  criteria" in output: 
    Do something 
+0

, который дает ту же ошибку. Это связано с кодировкой UTF –

1

Для людей, которые задаются вопросом, почему этот вопрос произошло. Из подпроцесса documentation -

If universal_newlines is True, the file objects stdin, stdout and stderr are opened as text streams in universal newlines mode, as described above in Frequently Used Arguments, otherwise they are opened as binary streams.

Значение по умолчанию для universal_newlines является False, то это означает, что стандартный вывод является двоичным потоком, и данные, которые он возвращает это строка байт.

И проблема возникает из-за того, что мы пытаемся сделать .find() на байтовой строке, проходящей в string в качестве аргумента. Очень простой пример, чтобы показать это -

>>> b'Hello'.find('Hello') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'str' does not support the buffer interface 

Вы должны .decode() данные, пример -

stdout = Popen(callbackquery, shell=True, stdout=PIPE, universal_newlines=True).stdout 
output = stdout.read.decode('<encoding>') #The encoding with which the output of the other process is returned, can be something like utf-8, etc. 
Смежные вопросы