【问题标题】:How set DISPLAY for python app using subprocess?如何使用子进程为 python 应用程序设置 DISPLAY?
【发布时间】:2018-03-19 15:19:48
【问题描述】:

我正在努力解决奇怪的问题。所以... 我有这个用 python 2.7 编写的守护进程/服务。它正在使用 subprocess.Popen 启动用 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 progamenv 的输出保存到文件中,我会得到:

_=/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

【问题讨论】:

  • 请将您的解决方案作为完整答案发布。

标签: python python-2.7 gtk environment-variables


【解决方案1】:

解决方案
我不得不改变:

env["XAUTHORITY"] = "~/.Xauthority"

直接路径。出于我的目的:

env["XAUTHORITY"] = "/root/.Xauthority"

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 2014-12-21
    • 2014-10-05
    • 2020-11-13
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多