2013-10-08 98 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