为何GNOME Builder运行Python时subprocess读取/usr/bin的结果与终端不一致
原因分析
- GNOME Builder 基于「GNOME Application」模板创建的Python项目默认采用Flatpak沙箱运行,你点击内置运行按钮启动的程序完全运行在隔离环境中,和宿主机的文件系统、已安装程序互不打通
- 你在宿主机通过apt安装的
hsetroot存放在宿主机的/usr/bin路径下,但沙箱内部的/usr/bin仅包含Flatpak运行时自带的工具,自然不存在hsetroot,你在脚本中执行ls /usr/bin输出的是沙箱内的文件列表,和宿主机输出不一致是正常现象
解决方案
方案1:切换为宿主机运行环境(本地开发推荐)
这是测试阶段成本最低的修改方式:
- 打开GNOME Builder的项目配置界面,找到运行配置项
- 将默认的Flatpak运行时替换为「主机操作系统」,保存配置后重启项目即可,此时程序直接运行在宿主机环境,可以正常调用你已经安装的
hsetroot
方案2:在Flatpak manifest中添加hsetroot依赖(打包分发推荐)
如果你最终需要将应用打包为Flatpak分发,可以修改项目根目录的Flatpak配置文件(一般为.json或.yml格式,文件名和你的应用ID一致),在modules段新增hsetroot的编译配置,构建应用时会自动将hsetroot打包进沙箱环境,运行时就能正常调用。
方案3:通过flatpak-spawn透传调用宿主机程序(临时测试用)
如果不想修改运行配置,也可以将调用命令修改为透传宿主机执行的格式:
subprocess.Popen(["flatpak-spawn", "--host", "hsetroot", "你的其他参数"])
该方法需要提前在Flatpak manifest中开启org.freedesktop.Flatpak接口权限,且仅适合本地测试,不建议在正式分发的版本中使用。
内容的提问来源于stack exchange,提问作者MrSprinkleToes
相关产品推荐
相关产品推荐

