如何将一个开放的二进制流(Python 2file、Python 3io.BufferedReader、Pythonio.BytesIO)包装到一个io.TextIOWrapper中?
我正在尝试编写可以正常工作的代码:在Python2上运行。
在Python3上运行。
使用从标准库生成的二进制流(即,我无法控制它们是什么类型)
将二进制流设为测试双倍(即没有文件句柄,无法重新打开)。
生成包装指定流的io.TextIOWrapper。
需要io.TextIOWrapper,因为标准库的其他部分需要它的API。存在其他类似文件的类型,但没有提供正确的API。
示例
包装显示为subprocess.Popen.stdout属性的二进制流:import subprocess
import io
gnupg_subprocess = subprocess.Popen(
["gpg", "--version"], stdout=subprocess.PIPE)
gnupg_stdout = io.TextIOWrapper(gnupg_subprocess.stdout, encoding="utf-8")
在单元测试中,流被替换为io.BytesIO实例,以控制其内容,而不接触任何子进程或文件系统。gnupg_subprocess.stdout = io.BytesIO("Lorem ipsum".encode("utf-8"))
它在Python 3的标准库创建的流上运行良好。但是,相同的代码在Python 2生成的流上失败:[Python 2]
>