【发布时间】:2015-03-11 00:57:45
【问题描述】:
我正在尝试在 Windows 下使用dd 进行简单的文件复制操作。代码很简单。只需使用子进程打开命令并阅读stderr。然后处理stderr 以显示操作的进度。这是我试图完成的示例/简单代码:-
import time
import signal
import subprocess
import os
def dd_win():
windd = "dd.exe"
in_file = os.path.join("E:", "test-in.iso")
out_file = os.path.join("E:", "test-out.iso")
parameter1 = "if=" + in_file
parameter2 = "of=" + out_file
parameter3 = "bs=1M"
parameter4 = "--progress"
command = [windd, parameter1, parameter2, parameter4]
print command
dd_process = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, bufsize=0)
while dd_process.poll() is None:
time.sleep(.1)
line = dd_process.stderr.readline()
if not line:
break
print ">>>>>", line.strip()
if dd_process.poll() is not None:
print "Process finished."
dd_win()
这是我得到的输出。我可以看到 stderr 但无法处理传输字节以转换为兆字节:-
C:\Users\user\Documents>python test.py
['dd.exe', 'if=E:test-in.iso', 'of=E:test-out.iso', '--progress']
>>>>> rawwrite dd for windows version 0.6beta3.
>>>>> Written by John Newbigin <jn@it.swin.edu.au>
>>>>> This program is covered by terms of the GPL Version 2.
>>>>>
175,882,240 # <--- Problem output line. Unable to assign to other variable for progress calculation
Process finished.
我实际上不知道这些数字是从哪里来的。是来自stderr 还是缓冲区?如果它来自stderr,那么应该在数字之前打印“>>>>>>”。我在 Windows 7 上工作并使用 dd 的 Windows 版本。
感谢任何帮助。
【问题讨论】:
-
如果您从代码中删除打印语句,
175,882,240是否仍然出现?您能否将程序中的 stdout 和 stderr 重定向到文件,以便查看175,882,240来自哪个流? -
如果我删除
print ">>>>>", line.strip()语句,那么我在屏幕上看不到任何输出。 -
如果您在终端中运行 dd 命令,您是否看到打印了“175,882,240”,还是只有在 Python 中执行时才看到?
-
我得到一个错误,
close_fds在 windows 平台上不受支持。 -
忽略我之前关于 close_fds 的评论 - 它默认设置为 True,如果 Windows 不支持它可能是相关的。
标签: python windows subprocess stderr