阻止subprocess.Popen在python中显示输出

2024-04-29 14:19:28 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图将命令的输出存储到变量中。我不希望它在运行命令时显示输出。。。

我现在掌握的代码如下。。。

def getoutput(*args):
    myargs=args
    listargs=[l.split(' ',1) for l in myargs]
    import subprocess
    output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE)   
    out, error = output.communicate()
    return(out,error)


def main():

    a,b=getoutput("httpd -S")

if __name__ == '__main__':
    main()

如果我把它放到一个文件中并在命令行上执行它。即使代码中没有print语句,也会得到以下输出。如何在保存输出的同时防止出现这种情况?

#python ./apache.py 
httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xx for ServerName
Syntax OK

Tags: 代码命令foroutputmaindefargserror
2条回答

您正在捕获stdout,但您没有捕获stderr(标准错误),我认为这是消息的来源。

output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE, stderr=STDOUT)

这将把stderr的任何东西放到stdout的同一个位置。

您看到的是标准错误输出,而不是标准输出。Stderr重定向由stderr构造函数参数控制。它默认为None,这意味着没有重定向发生,这就是为什么您看到这个输出。

通常保持stderr输出是个好主意,因为它有助于调试,并且不会影响正常的重定向(例如,|>shell重定向默认不会捕获stderr)。但是,您可以将其重定向到其他位置,方法与执行stdout相同:

sp = subprocess.Popen(listargs[0], shell=False,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = sp.communicate()

或者你可以直接放下武器:

devnull = open(os.devnull, 'wb') #python >= 2.4
sp = subprocess.Popen(listargs[0], shell=False,
    stdout=subprocess.PIPE, stderr=devnull)

#python 3.x:
sp = subprocess.Popen(listargs[0], shell=False
    stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)

相关问题 更多 >