gpt4 book ai didi

Python 2 到 3 转换 : iterating over lines in subprocess stdout

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:21 24 4
gpt4 key购买 nike

我有以下 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 的缓冲区太大。

最佳答案

您可以添加unversal_newlines=True

p = subprocess.Popen(call, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
for line in iter(p.stdout.readline, ''):
print(line, end='')

将返回 str 而不是 bytes,因此 '' 将在两种情况下都有效。

以下是文档对选项的说明:

If universal_newlines is False the file objects stdin, stdout and stderr will be opened as binary streams, and no line ending conversion is done.

If universal_newlines is True, these file objects will be opened as text streams in universal newlines mode using the encoding returned by locale.getpreferredencoding(False). For stdin, line ending characters '\n' in the input will be converted to the default line separator os.linesep. For stdout and stderr, all line endings in the output will be converted to '\n'. For more information see the documentation of the io.TextIOWrapper class when the newline argument to its constructor is None.

没有明确指出 bytesstr 的区别,但通过声明 False 返回二进制流和 True 返回文本流。

关于Python 2 到 3 转换 : iterating over lines in subprocess stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com