gpt4 book ai didi

python - 子进程 "TypeError: a bytes-like object is required, not ' str'"

转载 作者:太空狗 更新时间:2023-10-29 17:40:40 26 4
gpt4 key购买 nike

我正在使用来自 a previously asked question a few years ago 的代码但是,我认为这已经过时了。尝试运行代码时,我收到了上面的错误。我仍然是 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'))

回溯

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'

最佳答案

subprocess 默认为 stdout 或 stderr 流返回 bytes 对象。这意味着您还需要在针对这些对象的操作中使用 bytes 对象。 x 中的“Duration” 使用 str 对象。使用字节文字(注意 b 前缀):

return [x for x in result.stdout.readlines() if b"Duration" in x]

或者如果您知道使用的编码(通常是语言环境默认值,但您可以 set LC_ALL or more specific locale environment variables 用于子进程),则首先解码您的数据:

return [x for x in result.stdout.read().decode(encoding).splitlines(True)
if "Duration" in x]

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

result = subprocess.Popen(
["ffprobe", filename],
stdout=subprocess.PIPE, stderr = subprocess.STDOUT,
encoding='utf8'
)

如果您设置text=True(Python 3.7 及更高版本,在以前的版本中,此版本称为universal_newlines)您还可以启用解码,使用您的system default codec ,与用于 open() 调用的相同。在这种模式下,管道默认是行缓冲的。

关于python - 子进程 "TypeError: a bytes-like object is required, not ' str'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44989808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com