python - 如何使用 Python 从 dbus 插件(一个 systemd 服务)启动 gnome-terminal

标签 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 但仍然失败。

失败表示终端打不开,ps不显示终端。我也尝试过 os.system。如果直接从控制台运行它就可以工作。

os.system('gnome-terminal --/bin/bash -c "p​​ython/data/scripts/test.a.1.py -f/data/station_profile_A.json"')

日志日志显示以下错误:

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

如果我在 gnome-terminal 前面添加“DISPLAY=:0”,则没有帮助。

最佳答案

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

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

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

我建议您的 DBUS API 包括将 magic cookie 的副本(XAUTHORITY 文件的内容)移交给服务,然后该服务会将其写入临时文件,然后设置 DISPLAYXAUTHORITY 将运行该命令。

关于python - 如何使用 Python 从 dbus 插件(一个 systemd 服务)启动 gnome-terminal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53874944/

相关文章:

ubuntu - Bosh lite 中的 "Failed to connect to bus: No such file or directory"

glib - DBus,未能获得系统范围的名称

gnome - 用 Onboard -> Hide/Show via DBus 替换 Gnomes 虚拟键盘不起作用

python - 如何使用 Python 在自定义 dbus 上导出对象?

python - Flask的url_for不引用斜杠

python - Flask-Migrate 未检测到表格

python - 我可以使用 typing_extensions 中的实验类型吗?

python - 功能缩进不按预期工作

sockets - Nginx权限被拒绝连接到.socket

systemd - systemctl status 为 systemctl status(不是底层服务)中的错误返回什么返回码?