如何在python中重定向Gtk.Window()调用的stderr / stdout?

时间:2013-10-25 13:19:18

标签: python gtk pygtk

我在python中创建Gtk.Window()。因为我正在使用的主题,我收到了一些警告:

Gtk-WARNING **: Theme parsing error: other-applications.css:35:21: 'px' is not a valid color name

但是没关系。 我只希望从命令行输出中隐藏这些信息。

我尝试过但没有用的是:

# open /dev/null
devnull = open(os.devnull, 'w')

# redirect the stderr/out of the current process
sys.stdout = devnull
sys.stderr = devnull

# open the window
window = Gtk.Window()

print 'hello world'

# eventually restore previous stderr/out
...

问题是'hello world'没有打印(如预期的那样),但上面提到的警告仍然出现。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

重定向sys.stdoutsys.stderr仅影响Python代码;在您的情况下,您看到的错误来自Gtk(在较低级别)。

您必须使用原始文件描述符重定向。 看看这个:How do I prevent a C shared library to print on stdout in python?

基本上这里有一些代码可以将stdout重定向到C代码的最低级别, 但不是Python代码(得到了Dietrich Epp的回答):

def redirect_stdout():
    # Redirecting stdout
    sys.stdout.flush() # <--- important when redirecting to files
    newstdout = os.dup(1)
    devnull = os.open(os.devnull, os.O_WRONLY)
    os.dup2(devnull, 1)
    os.close(devnull)
    sys.stdout = os.fdopen(newstdout, 'w')

答案 1 :(得分:1)

@Matyas。

该错误是由旧版本的Gtk3引起的,可能发生在Debian Wheezy或Ubuntu 12.04中。 在Gtk3.4及更早版本中,px不支持作为一个单元。

修复它的一个简单方法是创建两个css文件,一个用px,一个没用。在python中将样式文件加载为CssProvider时,请检查当前的gtk3版本,如下所示:

if Gtk.MINOR_VERSION < 6:
    # load other-applications-3.4.css
else:
    # load other-applications.css

我之前在项目中遇到过这种情况。