我正在尝试为Ubuntu创建一个python安装脚本。我试图通过创建脚本来自动化它,而不必输入所有下载和编译命令。我真正想要它做的是不打印命令的所有输出,只输出错误,并将常规输出打印到文件。
我阅读了this stackoverflow指南和this python文档,但有些东西我无法弄清楚。每当我将call的stdout参数和Popen设置为None时,它仍然会输出到shell的输出,根据python文档,它不应该发生。
例如,假设我们在一个包含几个文件的目录中,“a”,“b”和“c”。根据python文档,以下命令应该只输出0.
>>> subprocess.call(["ls", "-a"])
0
但我没有得到那个。相反,我得到了输出:
>>> subprocess.call(['ls', '-a'])
. .. a b c
0
我已经尝试将stdout参数设置为None,但它仍然打印输出,这是不对的。 Subprocess.Popen具有相同的确切行为。如何让python不打印输出?
为了记录,我使用python 3.4.0运行Ubuntu 14.04 64位。
编辑:我也从文件内部尝试了上述内容并执行了该文件,但我仍然得到了错误的行为。
答案 0 :(得分:3)
您应该仔细阅读文档;来自subprocess.call
:
完整的函数签名与Popen构造函数[...]
的签名相同
来自subprocess.Popen
:
默认设置为None,不会发生重定向;子项的文件句柄将从父项继承。
因此,一般情况下,将stdout
设置为None
,将其设置为subprocess.STDOUT
。如果您需要将输出设置为subprocess.DEVNULL
,或将其存储在输出文件中,只需将打开的文件对象设置为参数。
要捕获并处理输出,请使用subprocess.check_output
。
答案 1 :(得分:0)
None
表示继承父级的标准流。将stdout重定向到文件并允许stderr继续打印到shell(如果父&#st; s stderr打印到shell):
import subprocess
with open('your_script.log', 'a') as logfile:
subprocess.check_call(['ls', '-a'], stdout=logfile)