Python3 与文件对象的兼容性

Python3 compatability with file object

我有一个 class/object,它是 linux 中一堆命令的子进程。该对象类似于:

def __enter__(self):
    self.proc = subprocess.Popen(self.cmd, bufsize=-1, shell=True, stdout=subprocess.PIPE, executable="/bin/bash")
    return self.process.stdout 

这基本上是 return Python2 中的 file 对象和 Python3 中的 _io.BufferedReader 对象。

我在每一行上执行一堆逻辑并创建一堆生成器。同时支持 python 2 和 3 的最佳方法是什么。例如,如果我有类似

的东西
line = input_file.next().strip().split(' ')

与 Python 2 一起工作,但对于 Python 3 我会得到类似

的东西
`_io.BufferedReader` object has no attribute 'next'

如果我将 input_file.next() 更新为 input_file.readline(),我会收到以下错误:

a bytes-like object is required, not 'str'

我可以继续相应地更新它以适用于 Python3,但是有没有更好的方法来做到这一点而不会在每种情况下完全不同 algo/logic?

top-level built-in 函数 next 适用于 Python 2 和 Python 3,所以不用 input_file.next() 使用 next(input_file)。至于始终按 ASCII space 字符拆分,只需在要拆分的字符串上加上 b 前缀即可;它在 Python 2 上没有任何变化(b' '' ' 相同,在 Python 2 上都是 str),在 Python 3 上,它使它成为一个 bytes 对象(二进制模式 Popen 进程产生)。

代码的最终版本是:

line = next(input_file).strip().split(b' ')

并且在 Python 2 和 Python 3 上工作相同。