我使用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”,则无济于事。
答案 0 :(得分:1)
要连接到X,您需要同时设置DISPLAY
和XAUTHORITY
。
例如XAUTHORITY=$HOME/.Xauthority
和DISPLAY=:0.0
。
由XAUTHORITY
命名的文件必须可读。该文件的模式为0600。
我建议您使用DBUS API,包括将魔术cookie的副本,XAUTHORITY
文件的内容移交给服务,然后将其写入临时文件,然后使用{{ 1}}和DISPLAY
集将运行命令。