如何使用 Python 从系统服务 dbus 插件启动 gnome 终端

How to launch gnome-terminal from dbus plugin, a systemd service, using Python

我使用 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 "python /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 协调员 [5380]:# 无法解析参数:无法打开显示:

如果我在 gnome-terminal 前添加 'DISPLAY=:0',它没有帮助。

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

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

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

我建议你让你的 DBUS API 包括将 magic cookie 的副本、XAUTHORITY 文件的内容交给服务,然后服务将其写入临时文件文件,然后使用 DISPLAYXAUTHORITY 设置将 运行 命令。