我有以下Python 2示例代码,我想与Python 3兼容:
call = 'for i in {1..5}; do sleep 1; echo "Hello $i"; done'
p = subprocess.Popen(call, stdout=subprocess.PIPE, shell=True)
for line in iter(p.stdout.readline, ''):
print(line, end='')
这在Python 2中运行良好但在Python 3中 p.stdout
不允许我指定编码并且读取它将返回字节字符串而不是Unicode,因此与 ''
的比较将始终返回false并且 iter
将不会停止 . This issue似乎暗示在Python 3.6中有一种定义这种编码的方法 .
现在,我已经将 iter
调用更改为在找到空字节字符串 iter(p.stdout.readline, b'')
时停止,这似乎在2和3中有效 . 我的问题是:这在2和3中都是安全的吗?有没有更好的方法来确保兼容性?
注意:我没有使用 for line in p.stdout:
因为我需要在生成时打印每一行,并且根据this answer p.stdout
有一个太大的缓冲区 .
2 回答
您可以添加
unversal_newlines=True
.而不是
bytes
,将返回str
,因此''
将在两种情况下都有效 .以下是文档对该选项的看法:
没有明确地提到
bytes
与str
之间的区别,但是通过声明False
返回二进制流并且True
返回文本流来暗示它 .您可以使用
p.communicate()
然后解码它,如果它是bytes
对象:这适用于Python 2和Python 3