Python的getstatusoutput更换不返回完整的输出(Python getstatuso

2019-07-29 01:10发布

我碰到这个伟大的replacment来抓getstatusoutput()在Python 2功能*,它同样适用于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

Answer 1:

有一个错误在此。

召唤:

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 -用于换行我仍然得到所有的线,按实际换行分隔)。



文章来源: Python getstatusoutput replacement not returning full output