我在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
答案 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
的东西 - 换行,我仍然得到所有的行,用实际换行符分隔。)