我碰到这个伟大的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
有一个错误在此。
召唤:
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
-用于换行我仍然得到所有的线,按实际换行分隔)。