2009-11-25 94 views
2

我有它使用上下文管理協議有一會兒(主要用於py2exe部署,其中應用任何內容寫入標準錯誤導致難看的對話無聲的標準錯誤流的一類最Python的方式時,應用程序是封閉的,而我這樣做,我知道會有一些標準錯誤輸出的東西)忽略輸出

import sys 
import os 
from contextlib import contextmanager 

@contextmanager 
def noStderr(): 
    stderr = sys.stderr 
    sys.stderr = open(os.devnull, "w") 
    yield 
    sys.stderr = stderr 

我的問題是,什麼是更Python,打開系統的比特鬥和寫入的是,的合理的清潔液或跳過FD的分配和寫入操作,並創建一個新的類ALA:

class nullWriter(object): 
    def write(self, string): 
     pass 

,然後用

from contextlib import contextmanager 

@contextmanager 
def noStderr(): 
    stderr = sys.stderr 
    sys.stderr = nullWriter() 
    yield 
    sys.stderr = stderr 

回答

4

我認爲後一種解決方案是更優雅。您避免進入系統環境,可能會浪費fd。爲什麼在不需要時退出操作系統?

3

我覺得nullWriter類會更「Python化」,因爲它使用Python接口已經到位(可分配sys.stderr到任何有替換上面的代碼寫方法),而不是走出去的系統環境,並寫入「位桶」你把它:)

+2

而FWIW,我會說,寫「位鬥」將是一個更Perlish的解決方案:) – Chirael 2009-11-25 22:41:50

2

它使用已經存在的東西(os.devnull)之間的決定,但都有點「混亂」(你需要open()這等「),並創建自己的解決方案,這可能是簡單的,但它是一個新的類,你正在創造。

雖然兩者都很好,但我會用nullWriter,因爲它更乾淨,並且依賴於純粹的Python知識,不會混淆os的東西。

1

這有什麼錯呢?

import sys 

sys.stderr = open('/dev/null', 'w') 
+2

作爲abyx建議,你應該使用os.devnull獨立於平臺。由於OP提到了py2exe,這可能是一個Windows盒子。 – 2009-11-26 07:38:36

+0

是真的。然而,這不是重點。我並不擔心那些演示解決方案的幾行代碼的可移植代碼。 – 2009-11-26 08:33:12

+0

但是,由於他很可能在Windows系統中,他可能甚至不知道/ dev/null的含義,使得你的建議不如應有的幫助。 – 2009-11-27 08:33:35

0

感謝所有的答覆。

我想我會用nullWriter方法去。我知道這兩個選項都可以工作,但更感興趣的是看看什麼更清晰(尤其是打開文件的開銷可忽略不計)。