Я могу воспроизвести это, установив GConf 2.24 на мою машину. GConf 2.22 работает нормально, но 2.24 ломает его.
GConf не запускается, потому что не работает D-Bus. Запуск D-Bus вручную и демон GConf снова делают эту работу.
Я попытался порождать сессионную шину D-Bus, выполнив следующие действия:
import dbus
dummy_bus = dbus.SessionBus()
... но получил это:
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Spawn.ExecFailed: dbus-launch failed to autolaunch D-Bus session: Autolaunch error: X11 initialization failed.
Weird. Похоже, он не любит подниматься, если X не работает. Чтобы обойти это, запустите dbus-launch вручную (IIRC использует вызов os.system () ):
$ dbus-launch
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-eAmT3q94u0,guid=c250f62d3c4739dcc9a12d48490fc268
DBUS_SESSION_BUS_PID=15836
Вам нужно будет как-то проанализировать выходные данные и вставить их в переменные окружения (вы, вероятно, захотите использовать os.putenv ). Для моего тестирования я просто использовал оболочку и вручную установил переменные среды с помощью export DBUS_SESSION_BUS_ADDRESS=blahblah...
и т. Д.
Далее вам нужно запустить gconftool-2 --spawn
с теми переменными среды, которые вы получили от dbus-launch
. Это запустит демон GConf. Если параметры среды D-Bus не заданы, демон не запустится.
Затем запустите ваш код GConf. При условии, что вы установили переменные среды шины сеанса D-Bus для своего собственного сценария, теперь вы сможете общаться с демоном GConf.
Я знаю, что это сложно.
gconftool-2
предоставляет опцию --direct
, которая позволяет вам устанавливать переменные GConf без необходимости взаимодействия с сервером, но я не смог найти эквивалентную опцию для привязок Python (если не выводить XML вручную) .
Редактировать: Для дальнейшего использования, если кто-то захочет запустить dbus-launch
из обычного bash
скрипта (в отличие от скрипта Python, как обсуждается в этой ветке), это довольно просто. чтобы получить адрес шины сеанса для использования в скрипте:
#!/bin/bash
eval `dbus-launch --sh-syntax`
export DBUS_SESSION_BUS_ADDRESS
export DBUS_SESSION_BUS_PID
do_other_stuff_here