Python DBUS SESSION_BUS - зависимость X11 - PullRequest
2 голосов
/ 27 января 2010

У меня запущен пример кода Python, который отлично подходит для рабочего стола Ubuntu:

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".

Надеюсь, что между SESSION_BUS и X11 не должно быть строгой зависимости, когда процесс, запущенный с помощью "dbus-launch", запускается и работает с успехом. Ошибка приходит в Python.

Лучшим решением будут чистые настройки среды Python или Linux, наихудшие, но, возможно, приемлемые с каким-нибудь поддельным или виртуальным X11 (мне не повезло, когда я попробовал)

1 Ответ

3 голосов
/ 27 января 2010

Проблема в том, что вы выполняете вызовы 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]
...