Python 3写入管道 [英] Python 3 writing to a pipe
问题描述
我正在尝试编写一些代码以将数据放入管道,并且我希望该解决方案与python 2.6+和3.x兼容. 示例:
I'm trying to write some code to put data into a pipe, and I'd like the solution to be python 2.6+ and 3.x compatible. Example:
from __future__ import print_function
import subprocess
import sys
if(sys.version_info > (3,0)):
print ("using python3")
def raw_input(*prmpt):
"""in python3, input behaves like raw_input in python2"""
return input(*prmpt)
class pipe(object):
def __init__(self,openstr):
self.gnuProcess=subprocess.Popen(openstr.split(),
stdin=subprocess.PIPE)
def putInPipe(self,mystr):
print(mystr, file=self.gnuProcess.stdin)
if(__name__=="__main__"):
print("This simple program just echoes what you say (control-d to exit)")
p=pipe("cat -")
while(True):
try:
inpt=raw_input()
except EOFError:
break
print('putting in pipe:%s'%inpt)
p.putInPipe(inpt)
上面的代码在python 2.6上有效,但在python 3.2上失败(请注意,上面的代码主要是使用2to3生成的-我只是为了使它与python 2.6兼容而稍微弄乱了.)
The above code works on python 2.6 but fails in python 3.2 (Note that the above code was mostly generated with 2to3 -- I just messed with it a little to make it python 2.6 compatible.)
Traceback (most recent call last):
File "test.py", line 30, in <module>
p.putInPipe(inpt)
File "test.py", line 18, in putInPipe
print(mystr, file=self.gnuProcess.stdin)
TypeError: 'str' does not support the buffer interface
我尝试了此处建议的字节函数(例如print(bytes(mystr,'ascii')), TypeError:"str"不支持缓冲区接口 但这似乎不起作用. 有什么建议吗?
I've tried the bytes function (e.g. print(bytes(mystr,'ascii')) suggested here, TypeError: 'str' does not support the buffer interface But that doesn't seem to work. Any suggestions?
推荐答案
print
函数将其参数转换为字符串表示形式,并将此字符串表示形式输出到给定文件.对于Python 2.x和Python 3.x,字符串表示形式始终为str
类型.在Python 3.x中,管道仅接受bytes
或缓冲区对象,因此这将不起作用. (即使将bytes
对象传递给print
,它也将转换为str
.)
The print
function converts its arguments to a string representation, and outputs this string representation to the given file. The string representation always is of type str
for both, Python 2.x and Python 3.x. In Python 3.x, a pipe only accepts bytes
or buffer objects, so this won't work. (Even if you pass a bytes
object to print
, it will be converted to a str
.)
一种解决方案是改用write()
方法(并在写入后刷新):
A solution is to use the write()
method instead (and flushing after writing):
self.gnuProcess.stdin.write(bytes(mystr + "\n", "ascii"))
self.gnuProcess.stdin.flush()
这篇关于Python 3写入管道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!