作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用来自 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/
我是一名优秀的程序员,十分优秀!