2013-10-08 60 views
0

为什么下面的MWE不会将输出重定向到/ dev/null。使用os.system保存输出()

#!/usr/bin/env python 
import os 

if __name__ == "__main__": 
    os.system ('echo hello &>/dev/null') 
+0

你是什么意思?对我来说,它不打印输出,所以它被重定向。 – Amadan

+1

我不确定MWE是什么,我不知道在什么平台上不会重定向到/ dev/null(它适用于OS X 10.8和一些古老的linux发行版),但是...为什么你首先使用'os.system'?如果你想控制发生的事情,就使用'subprocess',就像'os.system'文档所说的那样。 – abarnert

+0

我的猜测是MWE是“最低工作示例” – SethMMorton

回答

2

不知道,但另一个(更好)的方式来做到这一点是:

from os import devnull 
from subprocess import call 

if __name__ == "__main__": 
    with open(devnull, 'w') as dn: 
     call(['echo', 'hello'], stdout=dn, stderr=dn) 

这将打开/dev/null写作,并重定向衍生的过程中存在的输出。


更新基于意见从@abarnert

echo特定情况下,要获得相同的,你会想用shell=True相同的行为,否则它会调用/bin/echo,而不是shell内建:

call('echo hello', shell=True, stdout=dn, stderr=dn) 

此外,关于Python 3.3+,你可以做

from subprocess import call, DEVNULL 

if __name__ == "__main__": 
    call('echo hello', shell=True, stdout=DEVNULL, stderr=DEVNULL) 
+0

唯一的问题是,它运行'/ bin/echo'而不是shell内置'echo'。所以你可能需要'call('echo hello',shell = True,stdout = dn,stderr = dn)''。 – abarnert

+1

另外,在3.3+版本中,您可以使用'stdout = DEVNULL'而不是必须手动打开它,这很漂亮。 – abarnert

+0

@abarnert对于'shell = True',为什么在'''echo','hello']'上使用'echo hello''? – SethMMorton