我正在为奇怪的问题而苦苦挣扎。 所以...我有这个用python 2.7编写的守护程序/服务。它使用子进程启动使用 gtk 编写的 GUI 应用程序。波彭。
env = os.environ.copy()
env["DISPLAY"] = ":0"
env["XAUTHORITY"] = "~/.Xauthority"
subprocess.Popen('python2.7 /path/bla/bla/myapp.py', env=env, shell=True)
我得到这个错误:
/usr/lib/python2.7/site-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)
/path/bla/bla/myapp.pypy:43: Warning: invalid (NULL) pointer instance
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
/path/bla/bla/myapp.pypy:43: Warning: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
/path/bla/bla/myapp.pypy:93: GtkWarning: Screen for GtkWindow not set; you must always set
a screen for a GtkWindow before using the window
self.window.show_all()
/path/bla/bla/myapp.pypy:93: GtkWarning: IA__gdk_pango_context_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_context_set_font_description: assertion 'context != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_context_set_base_dir: assertion 'context != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_context_set_language: assertion 'context != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_new: assertion 'context != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_text: assertion 'layout != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_attributes: assertion 'layout != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_alignment: assertion 'layout != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_ellipsize: assertion 'PANGO_IS_LAYOUT (layout)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_single_paragraph_mode: assertion 'PANGO_IS_LAYOUT (layout)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_wrap: assertion 'PANGO_IS_LAYOUT (layout)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_set_width: assertion 'layout != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: PangoWarning: pango_layout_get_extents: assertion 'layout != NULL' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: GtkWarning: IA__gdk_screen_get_display: assertion 'GDK_IS_SCREEN (screen)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: GtkWarning: IA__gdk_display_get_pointer: assertion 'GDK_IS_DISPLAY (display)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: GtkWarning: IA__gdk_screen_get_n_monitors: assertion 'GDK_IS_SCREEN (screen)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:93: GtkWarning: IA__gdk_screen_get_monitor_geometry: assertion 'GDK_IS_SCREEN (screen)' failed
self.window.show_all()
/path/bla/bla/myapp.pypy:100: GtkWarning: IA__gdk_screen_get_root_window: assertion 'GDK_IS_SCREEN (screen)' failed
bitmap = gtk.gdk.Pixmap(None, w, h, 1)
/path/bla/bla/myapp.pypy:100: GtkWarning: IA__gdk_drawable_get_depth: assertion 'GDK_IS_DRAWABLE (drawable)' failed
bitmap = gtk.gdk.Pixmap(None, w, h, 1)
如果我保存 bash progam 的输出env
传递给这个子进程到文件,我会得到这个:
_=/usr/bin/env
LANG=pl_PL.UTF8
DISPLAY=:0
INVOCATION_ID=148ed44288654745b0a5a6ab4a8da7c1
PWD=/
JOURNAL_STREAM=9:62236
SHLVL=2
XAUTHORITY=~/.Xauthority
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
解决方案
我不得不改变:
env["XAUTHORITY"] = "~/.Xauthority"
到直接路径。为了我的目的:
env["XAUTHORITY"] = "/root/.Xauthority"