<p>默认情况下,<code>subprocess</code>返回stdout或stderr流的<code>bytes</code>对象。这意味着您还需要在对这些对象的操作中使用<code>bytes</code>对象。<code>"Duration" in x</code>使用<code>str</code>对象。使用字节文字(注意<code>b</code>前缀):</p>
<pre><code>return [x for x in result.stdout.readlines() if b"Duration" in x]
</code></pre>
<p>或者,如果您知道使用的编码(通常是区域设置默认值,但您可以为子进程<a href="https://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html#Locale-Environment-Variables" rel="noreferrer">set ^{<cd7>} or more specific locale environment variables</a>),请先对数据进行解码:</p>
<pre><code>return [x for x in result.stdout.read().decode(encoding).splitlines(True)
if "Duration" in x]
</code></pre>
<p>另一种方法是告诉<code>subprocess.Popen()</code>通过将<code>encoding</code>参数设置为合适的编解码器将数据解码为Unicode字符串:</p>
<pre><code>result = subprocess.Popen(
["ffprobe", filename],
stdout=subprocess.PIPE, stderr = subprocess.STDOUT,
encoding='utf8'
)
</code></pre>
<p>如果设置了<code>text=True</code>(Python 3.7及更高版本,在以前的版本中,此版本称为<code>universal_newlines</code>),则还可以使用<a href="https://docs.python.org/3/library/locale.html#locale.getpreferredencoding" rel="noreferrer">system default codec</a>启用解码,与用于<code>open()</code>调用的解码相同。在这种模式下,默认情况下管道是行缓冲的。</p>