Python 导入pynotify时发生GTK错误
导入pynotify时,我总是收到那些讨厌的GTK警告:Python 导入pynotify时发生GTK错误,python,gtk,Python,Gtk,导入pynotify时,我总是收到那些讨厌的GTK警告: ** (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 i
** (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
。您知道如何抑制这些消息吗?要抑制这些消息,您需要通过其文件描述符重定向stderr:
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
要抑制这些消息,您需要通过其文件描述符重定向stderr:
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
美好的顶部的文档字符串仍然显示,
带有suppress\u fd(…)
而不是带有suppress\u output(…)
。另外,如果你把这个东西放在一个模块中,你需要一个类似于suppress\u output import suppress\u output的行。顶部的文档字符串仍然显示,带有suppress\u fd(…)
而不是带有suppress\u output(…)
。此外,如果您将此内容放入模块中,则需要一行,如suppress\u output import suppress\u output
中的。