Python getstatusoutput替换不返回完整输出

时间:2012-04-18 02:43:21

标签: python pipe stdout

我在Python 2. *中遇到了getstatusoutput()函数的这个重要替换,它在Unix和Windows上运行良好。但是,我认为output的构建方式存在问题。它只返回输出的最后一行,但我无法弄清楚原因。任何帮助都会很棒。

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    """This new implementation should work on all platforms."""
    import subprocess
    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
    output = "".join(pipe.stdout.readlines())
    sts = pipe.returncode
    if sts is None: sts = 0
    return sts, output

1 个答案:

答案 0 :(得分:2)

这有一个错误。

电话:

pipe = subprocess.Popen(...)

开始这个过程。这一行:

output = "".join(pipe.stdout.readlines())

读取进程的标准输出(如果有错误输出它可能会被卡住,但由于你没有重定向stderr这是安全的;在更一般的情况下,你需要使用.communicate()功能,以避免可能的楔入)。您可能会想:嗯,既然我已经读完了所有输出,那么子流程已经完成了,所以应该设置pipe.returncode。但事实上,如果你取代:

sts = pipe.returncode
if sts is None: sts = 0

代码包含某种诊断(或者只是完全删除第二行),您会发现,至少在某些系统上,sts None。原因是subprocess模块还没有机会检索它。您应该用以下内容替换这些行:

sts = pipe.wait()

收集结果并避免is None测试的需要。 (即使您已使用.wait()和/或已经调用.communicate(),也可以安全地致电.wait()。)

只需使用

即可更有效地完成"".join(...)
output = pipe.stdout.read()

所有这一切,它确实得到了我的全部输出。也许您正在阅读仅使用'\r'换行的内容,而您的Python是在没有通用换行支持的情况下构建的? (如果我运行产生\r的东西 - 换行,我仍然得到所有的行,用实际换行符分隔。)