subprocess and Type Str doesnt support the buffer API

前端 未结 3 1079
有刺的猬
有刺的猬 2020-12-10 01:57

I have

cmd = subprocess.Popen(\'dir\',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
  columns = line.split(\' \')
  print (columns[3])
         


        
3条回答
  •  孤城傲影
    2020-12-10 02:28

    You are reading binary data, not str, so you need to decode the output first. If you set the universal_newlines argument to True, then stdout is automatically decoded using the result of the locale.getpreferredencoding() method (same as for opening text files):

    cmd = subprocess.Popen(
        'dir', shell=True, stdout=subprocess.PIPE, universal_newlines=True)
    for line in cmd.stdout:
        columns = line.decode().split()
        if columns:
            print(columns[-1])
    

    If you use Python 3.6 or newer, you can use an explicit encoding argument for to the Popen() call to specify a different codec to use, like, for example, UTF-8:

    cmd = subprocess.Popen(
        'dir', shell=True, stdout=subprocess.PIPE, encoding='utf8')
    for line in cmd.stdout:
        columns = line.split()
        if columns:
            print(columns[-1])
    

    If you need to use a different codec in Python 3.5 or earlier, don't use universal_newlines, just decode text from bytes explicitly.

    You were trying to split a bytes value using a str argument:

    >>> b'one two'.split(' ')
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: Type str doesn't support the buffer API
    

    By decoding you avoid that problem, and your print() call will not have to prepend the output with b'..' either.

    However, you probably just want to use the os module instead to get filesystem information:

    import os
    
    for filename in os.listdir('.'):
        print(filename)
    

提交回复
热议问题