2012-07-19 54 views
2

當導入pynotify我總是那些討厭的GTK的警告時:GTK錯誤導入pynotify

** (process:25512): WARNING **: Trying to register gtype 'GMountMountFlags' as enum when in fact it is of type 'GFlags' 
** (process:25512): WARNING **: Trying to register gtype 'GDriveStartFlags' as enum when in fact it is of type 'GFlags' 
** (process:25512): WARNING **: Trying to register gtype 'GSocketMsgFlags' as enum when in fact it is of type 'GFlags' 

的問題是,我不知道如何壓制他們,我想:

>>> import sys 
>>> from io import BytesIO 
>>> sys.stderr = BytesIO() 
>>> sys.stdout = BytesIO() 
>>> print 's' 
>>> import pynotify 

** (process:25512): WARNING **: Trying to register gtype 'GMountMountFlags' as enum when in fact it is of type 'GFlags' 

** (process:25512): WARNING **: Trying to register gtype 'GDriveStartFlags' as enum when in fact it is of type 'GFlags' 

** (process:25512): WARNING **: Trying to register gtype 'GSocketMsgFlags' as enum when in fact it is of type 'GFlags' 

不起作用,我試過的另一件事:

with warnings.catch_warnings(): 
    warnings.simplefilter('error') 
    import pynotify 

這也沒有幫助。

好像GTK的消息在不同的stderr到達。任何想法如何壓制他們?

回答

4

爲了抑制這些信息,你需要通過它的文件描述符以重定向標準錯誤:

import os 
from contextlib import contextmanager 

@contextmanager 
def suppress_output(fd): 
    """ 
    Suppress output to the given ``fd``:: 

     with suppress_fd(sys.stderr): 
      # in this block any output to standard error is suppressed 

    ``fd`` is an integral file descriptor, or any object with a ``fileno()`` 
    method. 
    """ 
    if hasattr(fd, 'fileno'): 
     # we were given a file-like object with an underlying fd 
     if hasattr(fd, 'flush'): 
      # flush Python-side buffers before redirecting 
      fd.flush() 
     # get the fd to redirect 
     fd = fd.fileno() 

    # duplicate the file descriptor to restore it eventually 
    oldfd = os.dup(fd) 
    try: 
     # open the trash can 
     devnull = os.open(os.devnull, os.O_WRONLY) 
     try: 
      # point the file descriptor to the trash can 
      os.dup2(devnull, fd) 
     finally: 
      # close the old trash can descriptor, we don't need it anymore 
      # since the fd now points to the trash can 
      os.close(devnull) 
     # enter the callers block 
     yield 
     # restore the file descriptor 
     os.dup2(oldfd, fd) 
    finally: 
     # close the duplicated copy of the original fd, we don't need it 
     # anymore now that fd is restored 
     os.close(oldfd) 

使用此功能是簡單的:

import sys 

with suppress_output(sys.stderr): 
    import pynotify 
+0

尼斯。頂部的文檔字符串仍然說'用suppress_fd(...)'代替'with suppress_output(...)'。另外,如果你把這個東西放在一個模塊中,你需要一行像'from suppress_output import suppress_output'。 – FutureNerd 2014-12-15 19:00:59