0

我在 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
4

1 回答 1

2

这有一个错误。

来电:

pipe = subprocess.Popen(...)

启动该过程。该行:

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

读取进程的标准输出(如果有错误输出,它可能会被卡住,但由于您没有重定向标准错误,这是安全的;在更一般的情况下,您需要使用该.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-for-newline 的东西,我仍然会得到所有行,由实际的换行符分隔。)

于 2012-04-18T03:09:19.620 回答