我正在尝试打开我的 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+的版本,
DEVNULL
3.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
没有给出任何错误,所以如果有什么不起作用,请说:)