Python 为什么subbess.call()和subprocess.Popen在';你不应该这样做吗?

Python 为什么subbess.call()和subprocess.Popen在';你不应该这样做吗?,python,subprocess,Python,Subprocess,我正在尝试为Ubuntu创建一个python安装脚本。我试图通过创建脚本来实现自动化,而不必键入所有下载和编译命令。我真正希望它做的是不打印命令的所有输出,只输出错误,并将常规输出打印到文件中 我阅读了stackoverflow指南和python文档,但有些东西我就是搞不懂。每当我将call和Popen的stdout参数设置为None时,它仍然会将输出输出输出到shell,根据python文档,这是不应该发生的 例如,假设我们所在的目录中有几个文件,“a”、“b”和“c”。根据python文档,

我正在尝试为Ubuntu创建一个python安装脚本。我试图通过创建脚本来实现自动化,而不必键入所有下载和编译命令。我真正希望它做的是不打印命令的所有输出,只输出错误,并将常规输出打印到文件中

我阅读了stackoverflow指南和python文档,但有些东西我就是搞不懂。每当我将call和Popen的stdout参数设置为None时,它仍然会将输出输出输出到shell,根据python文档,这是不应该发生的

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

>>> subprocess.call(["ls", "-a"])
0
但我不明白。相反,我得到的是输出:

>>> subprocess.call(['ls', '-a'])
.  ..  a  b  c
0
我尝试将stdout参数设置为None,但它仍在打印输出,这是不对的。Popen具有相同的确切行为。如何让python不打印输出

作为记录,我使用Python3.4.0运行Ubuntu 14.04 64位


编辑:我也从文件内部尝试了上述操作并执行了该文件,但仍然得到了错误的行为

您应该仔细阅读文档;从
子流程调用

完整函数签名与Popen构造函数的签名相同[…]

并从
子流程.Popen

默认设置为“无”时,不会发生重定向;子级的文件句柄将从父级继承

因此,一般来说,将
stdout
设置为
None
,与将其设置为
subprocess.stdout
一样有效。如果需要抑制输出,请将其设置为
subprocess.DEVNULL
,或将其存储在输出文件中,只需将打开的文件对象设置为参数


要捕获和处理输出,请使用
子流程。检查输出

您应该仔细阅读文档;从
子流程调用

完整函数签名与Popen构造函数的签名相同[…]

并从
子流程.Popen

默认设置为“无”时,不会发生重定向;子级的文件句柄将从父级继承

因此,一般来说,将
stdout
设置为
None
,与将其设置为
subprocess.stdout
一样有效。如果需要抑制输出,请将其设置为
subprocess.DEVNULL
,或将其存储在输出文件中,只需将打开的文件对象设置为参数


要捕获和处理输出,请使用
子流程。检查输出

您应该仔细阅读文档;从
子流程调用

完整函数签名与Popen构造函数的签名相同[…]

并从
子流程.Popen

默认设置为“无”时,不会发生重定向;子级的文件句柄将从父级继承

因此,一般来说,将
stdout
设置为
None
,与将其设置为
subprocess.stdout
一样有效。如果需要抑制输出,请将其设置为
subprocess.DEVNULL
,或将其存储在输出文件中,只需将打开的文件对象设置为参数


要捕获和处理输出,请使用
子流程。检查输出

您应该仔细阅读文档;从
子流程调用

完整函数签名与Popen构造函数的签名相同[…]

并从
子流程.Popen

默认设置为“无”时,不会发生重定向;子级的文件句柄将从父级继承

因此,一般来说,将
stdout
设置为
None
,与将其设置为
subprocess.stdout
一样有效。如果需要抑制输出,请将其设置为
subprocess.DEVNULL
,或将其存储在输出文件中,只需将打开的文件对象设置为参数


要捕获和处理输出,请使用
子流程。选中\u output

None
表示继承父级的标准流。要将stdout重定向到文件并允许stderr继续打印到shell(如果父级的stderr打印到shell):


None
表示继承父级的标准流。要将stdout重定向到文件并允许stderr继续打印到shell(如果父级的stderr打印到shell):


None
表示继承父级的标准流。要将stdout重定向到文件并允许stderr继续打印到shell(如果父级的stderr打印到shell):


None
表示继承父级的标准流。要将stdout重定向到文件并允许stderr继续打印到shell(如果父级的stderr打印到shell):



正如我理解您的问题一样,您想从python文件运行命令吗?然后将其输出到文件中,如果出现错误,请在命令行上显示它们?@smushi,是的,这是正确的。我理解了您的问题,您想从python文件运行命令吗?然后将其输出到文件中,如果出现错误,请在命令行上显示它们?@smushi,是的,这是正确的。我理解了您的问题,您想从python文件运行命令吗?然后将其输出到文件中,如果出现错误,请在命令行上显示它们?@smushi,是的,这是正确的。我理解了您的问题,您想从python文件运行命令吗?然后将其输出到文件中,如果出现错误,请在命令行上显示?@smushi,是的,这是正确的。+1表示文档参考。不要设置stdout=stdout
(这是一个错误)。只有
stderr=STDOUT
才有意义。@Arpegius谢谢你,我读它的时候不太明白这意味着什么。@wheeler评论中不需要坦克。请点击绿色按钮接受我的回答
import subprocess

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