subprocess"TypeError:需要一个类似字节的对象,而不是'str'"(Python 2 - > 3问题可能吗?)

cha*_*est 15 python string subprocess

几年前使用的是先前提出的问题的代码,但我相信这已经过时了.试图运行代码,我收到上面的错误.我仍然是python的新手,所以我无法从类似的问题中得到很多澄清.任何人都知道为什么会这样吗?

import subprocess

def getLength(filename):
  result = subprocess.Popen(["ffprobe", filename],
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
  return [x for x in result.stdout.readlines() if "Duration" in x]

print(getLength('bell.mp4'))
Run Code Online (Sandbox Code Playgroud)

追溯

Traceback (most recent call last):
  File "B:\Program Files\ffmpeg\bin\test3.py", line 7, in <module>
    print(getLength('bell.mp4'))
  File "B:\Program Files\ffmpeg\bin\test3.py", line 6, in getLength
    return [x for x in result.stdout.readlines() if "Duration" in x]
  File "B:\Program Files\ffmpeg\bin\test3.py", line 6, in <listcomp>
    return [x for x in result.stdout.readlines() if "Duration" in x]
TypeError: a bytes-like object is required, not 'str'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 27

subprocessbytes默认情况下返回stdout或stderr流的对象.这意味着您还需要bytes在针对这些对象的操作中使用对象."Duration" in x使用str对象.使用字节文字(注意b前缀):

return [x for x in result.stdout.readlines() if b"Duration" in x]
Run Code Online (Sandbox Code Playgroud)

另一种方法是LC_ALL通过将subprocess.Popen()参数设置为合适的编解码器来告诉将数据解码为Unicode字符串:

return [x for x in result.stdout.read().decode(encoding).splitlines(True)
        if "Duration" in x]
Run Code Online (Sandbox Code Playgroud)


Har*_*ota 5

就像错误所说的那样,“持续时间”是一个字符串。而 X 是一个类似字节的对象,因为results.stdout.readlines()将输出中的行读取为字节码而不是字符串。

因此将“持续时间”存储在一个变量中,比如 str_var 并使用str_var.encode('utf-8').

请参阅[此][1]。

[1]:在 Python 3 中将字符串转换为字节的最佳方法?