如何使用Python从dbus插件(系统服务)启动gnome-terminal

时间:2018-12-20 19:32:37

标签: python systemd dbus gnome-terminal

我使用Python开发了一个简单的基于dbus的插件(dbus.service.Object),该插件可从命令行脚本中进行IPC调用。 dbus服务配置为在systemd中托管。它正在按预期运行。但是,当我在插件中添加启动gnome终端的功能时,它失败了。似乎执行被卡在任何这些子流程调用中,无论是call()还是Popen()。想知道如何使插件正确启动gnome-terminal?

#subprocess.call(['gnome-terminal', '--', '/bin/bash', '-c', 'ls', '-al', '&'])
#subprocess.call(['systemd-run', '--user', '--service-type=forking', 'gnome-terminal', '-t', "Test",'--','/bin/bash', '-c', 'ls', '-al', "&"])
#subprocess.call(['DISPLAY=:0', 'gnome-terminal', '--', '/bin/bash', '-c', 'ls', '-al', '&'])

我还尝试从插件启动python脚本,并使脚本启动gnome-terminal,但仍然失败。

Fail表示终端无法打开,并且ps不显示终端。我也尝试了os.system。如果直接从控制台运行,它将起作用。

os.system('gnome-terminal-/ bin / bash -c“ python /data/scripts/test.a.1.py -f /data/station_profile_A.json”')

日记日志显示以下错误:

Dec 21 09:34:20 ubuntu协调器[5380]:无法初始化服务器:无法连接:连接被拒绝 12月21日09:34:20 ubuntu协调器[5380]:#无法解析参数:无法打开显示:

如果我在gnome-terminal前面添加“ DISPLAY =:0”,则无济于事。

1 个答案:

答案 0 :(得分:1)

要连接到X,您需要同时设置DISPLAYXAUTHORITY

例如XAUTHORITY=$HOME/.XauthorityDISPLAY=:0.0

XAUTHORITY命名的文件必须可读。该文件的模式为0600。

我建议您使用DBUS API,包括将魔术cookie的副本,XAUTHORITY文件的内容移交给服务,然后将其写入临时文件,然后使用{{ 1}}和DISPLAY集将运行命令。