通过 Python 子进程调用打开程序时的警告

通过 Python 子进程调用打开程序时的警告

我正在尝试打开我的 Python (3.3.2) 程序正在创建的图像和文本文件(文件创建没有问题)。程序的最后两行是:

subprocess.call(['leafpad', filename + '.tsv'])
subprocess.call(['gpicview',filename + '_fig.png'])

文本文件已成功打开,终端返回以下警告:

(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-bar-popup-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-label-select-on-focus after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-can-change-accels after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-popup-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-popdown-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-images after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-scrolled-window-placement after class was initialised

直到我关闭文本文件窗口后,图像文件才会打开,然后向终端返回以下类似的警告:

(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-scrolled-window-placement after class was initialised
(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-button-images after class was initialised
(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-label-select-on-focus after class was initialised

通过在线阅读其他线程,我发现警告对我来说不是问题(只是很可能由于最新的 dist 而存在,警告并没有真正困扰我)。

我的问题主要是警告(它会出现)阻止脚本继续运行并打开图像查看器,其次以一种看起来相当不专业的方式使终端变得混乱。感谢您在抑制这些警告方面提供的任何帮助,并使文本编辑器窗口和图像查看器窗口同时打开,并且在我的终端上没有一堆警告。

答案1

您当前的方法意味着发生了两件事:

  • 您正在看到子进程的输出

    进程可以有一些输出,以下是可能发生的两个:

    • STDOUT- 来自正在运行的程序的信息
    • STDERR- 有关程序遇到的警告错误的信息。这可能是让你烦恼的一个。

    使用 上的选项subprocess应该意味着您可以将输出通过管道传输到/dev/null(即不会出现在输出中):

    DEVNULL = open(os.devnull, 'wb')
    subprocess.call(['leafpad', filename + '.tsv'], stdout=DEVNULL, stderr=DEVNULL)
    

    这是Python 2.4+的版本,DEVNULL3.3+中可能不需要位定义

    请注意,即使您删除隐藏所有输出,它仍然会等待该过程,所以......

  • 它等待进程完成后再继续

    如果您想让该过程在后台继续进行,您可以使用以下命令:

    subprocess.Popen(['leafpad', filename + '.tsv'])
    

    Popen不等待进程退出,因此它将在后台继续(与call) - 有关更多信息,请参阅这里

将这些“修复”放在一起应该会给您带来:

DEVNULL = open(os.devnull, 'wb')
subprocess.Popen(['leafpad', filename + '.tsv'], stdout=DEVNULL, stderr=DEVNULL)

再次适用于 python 2.4+

您可以从文档中获取更多信息这里

我是 python 的业余爱好者,其版本leafpad没有给出任何错误,所以如果有什么不起作用,请说:)

相关内容