<pre><code>out, err = p.communicate('f')
</code></pre>
<p>可以替换为</p>
<pre><code>out, err = p.communicate(b'f')
</code></pre>
<p>只要您只希望<code>b'f'</code>成为唯一的输入。输入必须是字节数组,因为str可以编码为ISO-8859-1、UTF8、UCS16等。Python不知道应该使用哪种编码flac</p>
<p>但是,<code>p.communicate()</code>执行几个不同的步骤,并且单独处理每个步骤可能更清晰。例如,<code>err</code>变量将始终是<code>None</code>,因为对<code>Popen()</code>的调用不包括<code>stderr=subprocess.PIPE</code>。您可以编写以下内容,而不是p.communicate():</p>
<pre><code>p.stdout.write(b'f')
p.stdout.close()
out = p.stdin.read()
exit_code = p.wait()
</code></pre>
<p>在第一个示例中遇到的错误是因为所有<code>flac</code>参数必须位于<code>subprocess.Popen()</code>的第一个参数中。如果使用str作为第一个参数,则无法将任何其他参数传递给<code>flac</code><code>Popen("/usr/bin/flac", "-ts", stdout=PIPE, stderr=PIPE)</code>将<code>"-ts"</code>作为第二个参数传递,这是<code>bufsize</code>参数,它需要一个整数</p>
<p>我以前没有使用过<code>flac</code>,但我相信您需要将文件名作为参数传递。例如:</p>
<pre><code>subprocess.Popen(["flac", "-ts", f], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
</code></pre>
<p>我认为您不需要向<code>flac</code>发送数据,所以您可以直接调用<code>out_bytes = p.stdout.read()</code>。它将返回一个字节数组。如果要将其转换为str,可以调用<code>out_str = out_bytes.decode('utf-8')</code><code>flac</code>可能只是输出ascii,但UTF-8是ascii的超集,是最常见的编码</p>