2011-12-13 42 views
6

Tôi đang gặp một vấn đề mà tôi nhận được lỗi khi tôi cố gắng để thực thi mã này với python 3.2.2chuỗi định dạng cho stdin.write() trong python 3.x

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

working_file.stdin.write('message') 

Tôi hiểu rằng python 3 thay đổi cách nó xử lý chuỗi nhưng tôi không hiểu làm thế nào để định dạng 'tin nhắn'. Có ai biết làm thế nào tôi muốn thay đổi mã này để có giá trị?

cảm ơn nhiều

jon

update: heres được thông báo lỗi tôi nhận được

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 
+0

Bạn quên thông báo lỗi. –

Trả lời

2

là bạn thông báo lỗi "Lỗi Loại: 'str' không hỗ trợ giao diện đệm"? Thông báo lỗi đó cho bạn biết chính xác điều gì là sai. Bạn không viết các đối tượng chuỗi vào sdtin đó. Vậy bạn viết gì? Vâng, bất cứ điều gì hỗ trợ giao diện bộ đệm. Thông thường, đây là các đối tượng byte.

Giống như:

working_file.stdin.write(b'message') 
7

Tôi đồng ý với câu trả lời trước (trừ trường hợp "thông báo lỗi cho bạn biết chính xác những gì là sai" một phần), nhưng tôi muốn hoàn thành nó. Nếu trường hợp đó là bạn có một chuỗi ký tự mà bạn muốn ghi vào đường ống (và không phải là đối tượng byte), bạn có hai lựa chọn:

1) Mã hóa mọi chuỗi trước khi bạn viết chúng vào đường ống:

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

2) Bọc ống vào một giao diện văn bản đệm đó sẽ thực hiện mã hóa:

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

(Chú ý rằng các I/O hiện đang đệm, vì vậy bạn có thể cần phải gọi stdin_wrapper.flush() .)

Các vấn đề liên quan