Python 我怎样才能做一个假货;“活动会话”;对于gconf?

Python 我怎样才能做一个假货;“活动会话”;对于gconf?,python,ubuntu,gconf,ubuntu-8.10,Python,Ubuntu,Gconf,Ubuntu 8.10,我已经自动化了我的Ubuntu安装——我有了自动运行的Python代码(在一次干净的安装之后,但在第一次用户登录之前——它在一个临时的/etc/init.d/脚本中),它设置了从Apache及其配置到我个人Gnome首选项的所有内容。正是后者给我带来了麻烦 这在Ubuntu 8.04(Hardy)中运行良好,但当我在8.10(Intrepid)中使用它时,第一次尝试访问gconf时,我遇到了以下异常: 无法联系配置服务器;一些可能的原因是您需要为ORBit启用TCP/IP网络,或者由于系统崩溃而

我已经自动化了我的Ubuntu安装——我有了自动运行的Python代码(在一次干净的安装之后,但在第一次用户登录之前——它在一个临时的/etc/init.d/脚本中),它设置了从Apache及其配置到我个人Gnome首选项的所有内容。正是后者给我带来了麻烦

这在Ubuntu 8.04(Hardy)中运行良好,但当我在8.10(Intrepid)中使用它时,第一次尝试访问gconf时,我遇到了以下异常:

无法联系配置服务器;一些可能的原因是您需要为ORBit启用TCP/IP网络,或者由于系统崩溃而导致NFS锁过期。有关信息,请参阅。(详细信息-1:未在活动会话中运行

是的,是的,当它运行时,没有Gnome会话,因为用户还没有登录-但是,这以前工作过;这似乎是新的无畏的侏儒(2.24?)

除了直接修改gconf的XML文件外,有没有办法进行某种代理Gnome会话?或者,还有其他建议吗


(更多详细信息:这是以root身份运行的python代码,但setuid和setgid必须是我,然后才能使用python gconf包中的“gconf”模块设置我的首选项。)

好吧,我想我理解这个问题。看起来您的脚本只需要启动dbus守护进程,或者确保其已启动。我相信这里的“会话”指的是dbus会话,不是Gnome会话。Dbus和gconf在没有Gnome的情况下运行良好

不管怎样,假装“活动会话”听起来都是一个非常糟糕的主意。它只有在需要的时候才会去寻找


也许我们可以在粘贴箱中看到脚本?在发表任何评论之前,我真的应该看过它。

我可以通过在我的机器上安装GConf 2.24来复制它。GCONF2.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.
奇怪。如果X没有运行,它看起来就不会出现。要解决此问题,请手动启动dbus启动(IIRC使用调用):

您需要以某种方式解析输出并将其注入环境变量(您可能希望使用)。对于我的测试,我只是使用shell,并使用export DBUS_SESSION_BUS_ADDRESS=blahblah…等手动设置环境变量

接下来,您需要启动
gconftool-2——使用从
dbus启动
收到的环境变量生成。这将启动GConf守护进程。如果未设置D-Bus环境变量,则守护进程将不会启动

然后,运行GConf代码。如果您为自己的脚本设置了D-Bus会话总线环境变量,现在就可以与GConf守护进程通信

我知道这很复杂

gconftool-2
提供了一个
--direct
选项,使您能够设置GConf变量,而无需与服务器通信,但我还无法找到Python绑定的等效选项(除了手动输出XML)

编辑:为了便于将来参考,如果有人想在正常的
bash
脚本中运行
dbus-launch
(与本线程讨论的Python脚本相反),那么检索脚本中使用的会话总线地址非常容易:

#!/bin/bash

eval `dbus-launch --sh-syntax`

export DBUS_SESSION_BUS_ADDRESS
export DBUS_SESSION_BUS_PID

do_other_stuff_here

谢谢,阿里和杰里米-你的两个答案都帮了大忙。我还在做这件事(虽然我今晚已经停下来了)

首先,我接受了阿里的暗示,并尝试了杰里米建议的一部分:我使用dbus launch运行“gconftool-2--spawn”。它对我不起作用;我现在明白了为什么(thx,Jeremy)——我试图在启动dbus&gconftool的同一个python程序中使用gconf,但是它的环境没有环境变量——duh

当我注意到gconftool-2的——直接选项时,我把这个策略放在一边;在内部,gconftool-2正在使用gconf python绑定未公开的API。因此,我修改了python gconf以公开额外的方法,一旦构建完成(我在使其工作时遇到了一些不相关的问题),我们将看看这是否解决了问题——如果它没有解决问题(如果解决了问题,也许会解决,因为构建这些绑定似乎构建了所有gnome!),在第一个策略中,我将找到更好的方法来管理环境变量

(不管怎样,我明天都会在这里补充另一个答案)


第二天:我在修改python gconf时遇到了一点小麻烦,这启发我尝试Jeremy的更简单的想法,这个想法很好——在执行第一个gconf操作之前,我只需运行“dbus launch”,解析得到的名称-值对,并将它们直接添加到python环境中。完成后,我运行了“gconftool-2--spawn”。问题已解决。

如果新的Python API有用,请确保向上游提交更改。遇到相同的问题,设置这些DBUS变量使gconf重新启动。谢谢作为参考,问题是在进化任务列表消失时开始的。
#!/bin/bash

eval `dbus-launch --sh-syntax`

export DBUS_SESSION_BUS_ADDRESS
export DBUS_SESSION_BUS_PID

do_other_stuff_here