Python DBUS SESSION_BUS - X11依赖

时间:2010-01-27 00:36:42

标签: python x11 dbus

我已经运行了在Ubuntu桌面上运行的示例python代码:

import dbus, gobject
from dbus.mainloop.glib import DBusGMainLoop
from dbus.mainloop.glib import threads_init
import subprocess
from subprocess import call

gobject.threads_init()
threads_init()
dbus.mainloop.glib.DBusGMainLoop( set_as_default = True )

p = subprocess.Popen('dbus-launch --sh-syntax', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
call( "export DBUS_SESSION_BUS_ADDRESS" , shell=True )
call( "export DBUS_SESSION_BUS_PID" , shell=True )

bus = dbus.SessionBus()

# get DBUS objects, do other stuff with SESSION_BUS
# in same time we can start more independent processes with this file
# finaly kill the SESSION_BUS process

在桌面上取得成功之后,我将代码移到了只有shell的服务器版本。 dbus-launch启动进程,但python dbus.SessionBus()返回错误,“/ bin / dbus-launch异常终止,出现以下错误:自动启动错误:X11初始化失败”。

希望在“dbus-launch”启动过程成功运行时,SESSION_BUS和X11之间不应存在严格的依赖关系。错误来自python。

最好的解决方案将是干净的python或linux环境设置,最差但可能接受一些假的或虚拟的X11(当我尝试时我不幸运)

1 个答案:

答案 0 :(得分:3)

问题是您在单独的shell中运行export调用。您需要捕获dbus-launch的输出,解析值,并使用os.environ将它们写入环境:

p = subprocess.Popen('dbus-launch', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for var in p.stdout:
  sp = var.split('=', 1)
  print sp
  os.environ[sp[0]] = sp[1][:-1]