Python DBUS 会话总线 - X11 依赖问题
我有一段在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
在桌面上成功运行后,我把代码移到了只有命令行的服务器版本上。使用dbus-launch启动进程时,python中的dbus.SessionBus()却返回了一个错误,提示“/bin/dbus-launch异常终止,错误信息:自动启动错误:X11初始化失败”。
我希望在使用“dbus-launch”启动进程时,SESSION_BUS和X11之间不应该有严格的依赖关系,这样进程才能顺利运行。错误出现在Python代码中。
最好的解决办法是清理Python或Linux的环境设置,最糟糕但也许可以接受的办法是使用一些虚假的或虚拟的X11(不过我尝试的时候运气不太好)。
1 个回答
5
问题在于你在不同的命令行窗口中运行了 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]