форматирование строк для stdin.write () в python 3.x - PullRequest
9 голосов
/ 13 декабря 2011

У меня возникла проблема, когда я получаю ошибки при попытке выполнить этот код с python 3.2.2

working_file = subprocess.Popen(["/pyRoot/iAmAProgram"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

working_file.stdin.write('message')

Я понимаю, что Python 3 изменил способ обработки строк, но я не понимаю, какотформатировать «сообщение».Кто-нибудь знает, как я изменил бы этот код, чтобы он был действительным?

большое спасибо

jon

update: вот сообщение об ошибке, которое я получаю

Traceback (most recent call last):
  File "/pyRoot/goRender.py", line 18, in <module>
    working_file.stdin.write('3')
TypeError: 'str' does not support the buffer interface

Ответы [ 2 ]

8 голосов
/ 24 мая 2013

Я согласен с предыдущим ответом (за исключением части «сообщение об ошибке сообщает точно, что не так»), но я хотел бы завершить ее.Если дело в том, что у вас есть строка, которую вы хотите записать в канал (а не объект байтов), у вас есть два варианта:

1) Прежде чем записать их в канал, сначала закодируйте каждую строку:

working_file.stdin.write('message'.encode('utf-8'))

2) Обернуть канал в буферизованный текстовый интерфейс, который будет выполнять кодировку:

stdin_wrapper = io.TextIOWrapper(working_file.stdin, 'utf-8')
stdin_wrapper.write('message')

(обратите внимание, что теперь ввод / вывод буферизуется, поэтому вам может понадобитьсявызовите stdin_wrapper.flush ().)

5 голосов
/ 13 декабря 2011

Ваше сообщение об ошибке "Ошибка типа: 'str' не поддерживает интерфейс буфера"?Это сообщение об ошибке говорит вам, что именно не так.Вы не пишете строковые объекты в этот sdtin.Так что ты пишешь?Ну, все, что поддерживает интерфейс буфера.Обычно это байтовые объекты.

Как:

working_file.stdin.write(b'message')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...