2010-01-27 2 views
1

Я получил запущен образец кода питона, который отлично в рабочем столе Ubuntu:Python DBUS SESSION_BUS - Х11 зависимость

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 запускает процесс, но python dbus.SessionBus() возвращает ошибку с «/ bin/dbus-запуском, анонимно завершившимся со следующей ошибкой: Ошибка автоклавирования: неудачная инициализация X11».

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

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

ответ

2

Проблема в том, что вы работаете на 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] 
+0

Великий, os.environ сделал свою работу! Спасибо. –