Python DBUS SESSION_BUS - X11 依赖

Posted

技术标签:

【中文标题】Python DBUS SESSION_BUS - X11 依赖【英文标题】:Python DBUS SESSION_BUS - X11 dependency 【发布时间】:2011-01-09 18:28:31 【问题描述】:

我已经运行了在 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】:

问题是您在单独的 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]

【讨论】:

太好了,os.environ 完成了这项工作!谢谢。

以上是关于Python DBUS SESSION_BUS - X11 依赖的主要内容,如果未能解决你的问题,请参考以下文章

Python异步和dbus

如何使用 python 处理 dbus 接口的属性?

PowerManagement.Inhibit 适用于 dbus-python 但不适用于 dbus-send

dbus-python 如何获得原生类型的响应?

适用于 Windows 的 Dbus-Python

如何为两个单独的 Dbus Python 程序创建 Dbus Mainloop