【问题标题】:Unable to process python subprocess stderr on windows无法在 Windows 上处理 python 子进程 stderr
【发布时间】: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 "&gt;&gt;&gt;&gt;&gt;", line.strip() 语句,那么我在屏幕上看不到任何输出。
  • 如果您在终端中运行 dd 命令,您是否看到打印了“175,882,240”,还是只有在 Python 中执行时才看到?
  • 我得到一个错误,close_fds 在 windows 平台上不受支持。
  • 忽略我之前关于 close_fds 的评论 - 它默认设置为 True,如果 Windows 不支持它可能是相关的。

标签: python windows subprocess stderr


【解决方案1】:

正如聊天中所讨论的,这些数字来自标准错误。通过打印行中每个字符的 ascii-indexes,我们发现 readline() 返回的最后一行是\t75,881,728 \r175,882,240 \r\n。看起来嵌入在此字符串(DD 输出)中间的 \r 混淆了您的代码。

【讨论】:

  • OP 可以使universal_newlines=True\r 视为换行符。 \r 可用于报告进度(例如,see how reporthook() uses \r)——它可以指示终端将光标移动到行首。
猜你喜欢
  • 2012-09-05
  • 1970-01-01
  • 2011-06-15
  • 2013-06-07
  • 1970-01-01
  • 2018-10-02
  • 2015-04-12
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多