<p>要在终端中显示<code>dd</code>的进度报告并将输出保存(解析)到日志文件中:</p>
<pre><code>#!/usr/bin/env python3
import io
from subprocess import PIPE, Popen
from time import monotonic as timer
cmd = "dd if=/dev/sda1 of=image.dd bs=524288 count=3000 status=progress".split()
with Popen(cmd, stderr=PIPE) as process, \
open("log_file.log", "a") as log_file:
start_time = timer()
for line in io.TextIOWrapper(process.stderr, newline=''):
print(line, flush=True, end='') # no newline ('\n')
if 'bytes' in line:
# XXX parse line here, add flush=True if necessary
print(line, file=log_file)
# print duration
print('Took {duration} seconds'.format(duration=timer() - start_time))
</code></pre>
<h3>注</h3>
<ul>
<li>否<code>shell=True</code>:这里不需要shell。<code>Popen()</code>可以直接运行<code>dd</code></li>
<li>没有线程,队列:这里不需要它们</li>
<li>请不要使用<code>while proc1.poll() == None</code>您不需要它(如果<code>proc1.poll()</code>不是None,您将在<code>proc1.stderr</code>上看到EOF)。您可能会丢失数据(即使进程已经退出,也可能存在缓冲内容)。无关:如果需要与<code>None</code>进行比较,请使用<code>is None</code>而不是{<cd10>}</li>
<li><code>io.TextIOWrapper(newline='')</code>启用文本模式
(它使用<code>locale.getpreferredencoding(False)</code>)并且
也将<code>'\r'</code>视为换行符</li>
<li>使用默认值<code>bufsize=-1</code>(请参见<a href="https://docs.python.org/3/library/io.html#io.DEFAULT_BUFFER_SIZE" rel="nofollow">^{<cd15>}</a>)</li>
</ul>