formatting strings for stdin.write() in python 3.x

2019-02-16 20:30发布

I'm having a problem where I get errors when I try to execute this code with python 3.2.2

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

working_file.stdin.write('message')

I understand that python 3 changed the way it handles strings but I dont understand how to format the 'message'. Does anyone know how I'd change this code to be valid?

many thanks

jon

update: heres the error message i get

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条回答
Summer. ? 凉城
2楼-- · 2019-02-16 20:57

I agree with the previous answer (except for the "the error message tells you exactly what's wrong" part), but I'd like to complete it. If the case is that you have a string that you want to write into the pipe (and not a bytes object), you have two choices:

1) Encode every string first before you write them to the pipe:

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

2) Wrap the pipe into a buffered text interface that will do the encoding:

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

(Notice that the I/O is now buffered, so you may need to call stdin_wrapper.flush().)

查看更多
趁早两清
3楼-- · 2019-02-16 20:58

Is your error message "TypeError: 'str' does not support the buffer interface"? That error message tells you pretty much exactly what is wrong. You don't write string objects to that sdtin. So what do you write? Well, anything supporting the buffer interface. Typically this is bytes objects.

Like:

working_file.stdin.write(b'message')
查看更多
登录 后发表回答