subprocess
returns bytes
objects for stdout or stderr streams by default. That means you also need to use bytes
objects in operations against these objects. "Duration" in x
uses str
object. Use a bytes literal (note the b
prefix):
return [x for x in result.stdout.readlines() if b"Duration" in x]
or decode your data first, if you know the encoding used (usually, the locale default, but you could set LC_ALL
or more specific locale environment variables for the subprocess):
return [x for x in result.stdout.read().decode(encoding).splitlines(True)
if "Duration" in x]
The alternative is to tell subprocess.Popen()
to decode the data to Unicode strings by setting the encoding
argument to a suitable codec:
result = subprocess.Popen(
["ffprobe", filename],
stdout=subprocess.PIPE, stderr = subprocess.STDOUT,
encoding='utf8'
)
If you set text=True
(Python 3.7 and up, in previous versions this version is called universal_newlines
) you also enable decoding, using your system default codec, the same one that is used for open()
calls. In this mode, the pipes are line buffered by default.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…