2014-10-27 41 views
0

我想为Ubuntu创建一个python安装脚本。我试图通过创建脚本来自动化它,而不必输入所有的下载和编译命令。我真正想要的是不打印命令的所有输出,只输出错误,并将常规输出打印到文件中。为什么subprobess.call()和subprocess.Popen打印时,他们不应该?

我看了this stackoverflow指南和this python文件,但有一些我只是无法弄清楚。每当我将调用和Popen的stdout参数设置为None时,它仍然会将输出打印到shell,根据python文档,它不应该发生。

例如,假设我们在一个包含几个文件“a”,“b”和“c”的目录中。根据python文档,以下命令应该只输出0.

>>> subprocess.call(["ls", "-a"]) 
0 

但我没有那样做。相反,我得到的输出:

>>> subprocess.call(['ls', '-a']) 
. .. a b c 
0 

我已经尝试设置标准输出参数设置为None,但它仍然是打印输出,这是不对的。 Subprocess.Popen具有相同的确切行为。我怎样才能让Python不打印输出?

为了记录,我使用python 3.4.0运行Ubuntu 14.04 64位。

编辑:我也尝试了以上从文件内执行该文件,但我仍然得到不正确的行为。

+0

我的理解你的问题,你想从运行巨蟒文件中的命令? 然后将其输出到文件,如果有错误,请在命令行上显示它们? – smushi 2014-10-27 05:48:56

+0

@smushi,是的,这是正确的。 – wheeler 2014-10-27 14:04:17

回答

3

您应该仔细阅读文档;从subprocess.call

完整的函数签名相同的POPEN构造的[...]

而且从subprocess.Popen

随着无的默认设置,不会发生重定向;孩子的文件句柄将从父类继承。

所以一般情况下,将stdout设置为None,将其设置为subprocess.STDOUT。如果您需要抑制输出将其设置为subprocess.DEVNULL,或将其存储在输出文件中,则只需将打开的文件对象设置为参数即可。

要捕获并处理输出,请使用subprocess.check_output

+1

+1为文档参考。不要设置'stdout = STDOUT'(这是一个错误)。只有'stderr = STDOUT'是有道理的。 – jfs 2014-10-27 07:29:02

+0

@Arpegius谢谢,我不太明白当我阅读它时是什么意思。 – wheeler 2014-10-27 14:08:12

+0

@wheeler评论中无需坦克。请点击绿色复选标记接受我的回答。 – Arpegius 2014-10-27 14:11:22

0

None表示继承父母的标准流。为了stdout重定向到一个文件,并允许标准错误,继续打印到外壳(如果父母的标准错误打印到外壳):

import subprocess 

with open('your_script.log', 'a') as logfile: 
    subprocess.check_call(['ls', '-a'], stdout=logfile) 
相关问题