python subprocess decode报错?

python小白,在看廖雪峰python subprocess教程的时候碰到下面一个执行 nslookup 命令的报错

操作系统:win10 python版本:3.7
import subprocess
print('$ nslookup')
p = subprocess.Popen(['nslookup'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('utf-8'))
print('Exit code:', p.returncode)

报错信息:

$ nslookup
Traceback (most recent call last):
  File "E:/py/learning-python/Process_Thread/multi_process/sub_process.py", line 14, in <module>
    print(output.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 2: invalid continuation byte

Process finished with exit code 1

请问造成这个错误的原因是什么?如何解决谢谢。

阅读 7.7k
2 个回答

老铁, 和subprocess没啥关系, 其实是一个bytes类转换为str的编码问题

你试试:

>>> print(output.decode('gbk'))

默认服务器:  dns.xxx.xxx.cn
Address:  xxx.xxx.xxx.xxx

> > 服务器:  dns.xxx.xxx.cn
Address:  xxx.xxx.xxx.xxx

python.org    MX preference = xx, mail exchanger = mail.python.org

python.org    nameserver = nsx.pxx.dynect.net
python.org    nameserver = nsx.pxx.dynect.net
python.org    nameserver = nsx.pxx.dynect.net
python.org    nameserver = nsx.pxx.dynect.net
> 

这个字符串里面有中文

而此句output, err = p.communicate(b'set q=mx\npython.org\nexit\n')中, output的编码是GBK

所以不能用utf-8来解码

这个其实是gbk编码和utf-8编码产生了冲突的问题

虽说都支持中文, 但是给中文编码的顺序不同, 我举个例子吧:

>>> '我'.encode()    
b'\xe6\x88\x91'
>>> '我'.encode('gbk')
b'\xce\xd2'

可以参考这位大佬的文章:https://www.cnblogs.com/gavin...

祝你好运!

decode默认使用strict模式,第二个参数改成 ignore的话可正常解码,具体原因不知道是什么.

print(output.decode('utf-8','ignore'))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏