我已经在 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
Run Code Online (Sandbox Code Playgroud)
在桌面上成功后,我将代码移至仅使用 shell 的服务器版本。dbus-launch 启动进程,但 python dbus.SessionBus() 返回错误“/bin/dbus-launch 异常终止,并出现以下错误:自动启动错误:X11 初始化失败”。
希望当进程以“dbus-launch”启动并成功运行时,SESSION_BUS 和 X11 之间不应该存在严格的依赖关系。错误出现在 python 中。
最好的解决方案是干净的 python 或 linux 环境设置,最糟糕但也许可以接受一些假的或虚拟的 X11(当我尝试时我并不幸运)
问题是您export
在单独的 shell 中运行调用。您需要捕获 的输出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]
Run Code Online (Sandbox Code Playgroud)