Discuss / Python / 在PyCharm上执行 那个子进程的 communicate()似乎不行呀?

在PyCharm上执行 那个子进程的 communicate()似乎不行呀?

Topic source
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 "F:/untitled1/hello.py", line 66, in <module>

    print(output.decode('utf-8'))

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 2: invalid continuation byte

```

ywjco_567

#2 Created at ... [Delete] [Delete and Lock User]

是有这个问题,试了一下先用print(output):

def sp_comm():
    '''子进程还需要输入,可以通过communicate()方法输入'''
    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)
    print(output.decode('utf-8'))

输出:

D:\Python37\python.exe D:/Python37/Code/mp_communicate.py

$ nslookup

Traceback (most recent call last):

  File "D:/Python37/Code/mp_communicate.py", line 21, in <module>

    sp_comm()

  File "D:/Python37/Code/mp_communicate.py", line 14, in sp_comm

    print(output.decode('utf-8'))

UnicodeDecodeError: 'utf-8' codec can't decode byte **0xc8** in position 2: invalid continuation byte

b'\xc4\xac\**xc8**\xcf\xb7\xfe\xce\xf1\xc6\xf7:  UnKnown\r\nAddress:  192.168.1.1\r\n\r\n> > \xb7\xfe\xce\xf1\xc6\xf7:

Exit code: 0

问题是出现了utf-8不能解码的字节:\xc8。将出错信息拷到网上查,发现:encoding = 'gbk'就能解决问题。

GBK,又称GBK大字符集,是将所有亚洲文字的双字节字符,包括简体中文、繁体中文、日语、韩语等,都使用一种格式编码,兼容所有平台的上的语言。GBK大字符集包含的汉字数量比GB2312和BIG5多,使得汉字兼容足够使用。   

最后:

def sp_comm():
    '''子进程还需要输入,可以通过communicate()方法输入'''
    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(output.decode('gbk'))
    print('Exit code:', p.returncode)

  • 1

Reply