Python2与Python3 print输出差异及Python3适配方案问询
解决Python3与Python2输出字节一致的问题
问题根源
Python2里的字符串默认是字节串(bytes),print会直接把字节原封不动输出到终端;而Python3里的字符串是Unicode字符串,print会自动将Unicode编码为终端的默认字符集(通常是UTF-8),这就导致你输入的"\xef\xbe\xad\xde"在两种版本中输出的字节完全不同——Python2直接输出这四个字节,Python3则把它们当成Unicode字符编码成UTF-8字节,自然结果不一样。
两种解决方案
方法1:直接写入标准输出的字节流
绕过Python3的Unicode处理,直接通过sys.stdout.buffer写入原始字节,和Python2的print行为完全一致。注意要手动添加换行符(b"\n"),因为write不会像print那样自动加换行:
$ python3 -c 'import sys; sys.stdout.buffer.write(b"A"*20 + b"\xef\xbe\xad\xde" + b"A"*4 + b"\n")'
执行后输出的字节和Python2完全相同,管道传输给其他进程也不会有差异。
方法2:强制输出编码为Latin-1
Latin-1是单字节编码,每个字节对应唯一的Unicode字符,这样Python3的print会把Unicode字符串按Latin-1编码成原始字节,和Python2的输出一致。通过设置PYTHONIOENCODING环境变量实现:
$ PYTHONIOENCODING=latin-1 python3 -c 'print("A"*20 + "\xef\xbe\xad\xde" + "A"*4)'
这个命令的输出会和Python2的AAAAAAAAAAAAAAAAAAAAᆳ▒AAAA完全一致。
内容的提问来源于stack exchange,提问作者Black Hemera
相关产品推荐
相关产品推荐

