Ubuntu 20.04中.sh/.desktop无法运行含tkinter、ROOT的Python脚本
故障根因
终端执行脚本时会自动加载交互式shell的配置文件(~/.bashrc、~/.profile等),ROOT安装时默认会在这些配置里写入source /对应路径/root/bin/thisroot.sh的初始化逻辑,自动把ROOT的Python库路径加入PYTHONPATH,所以终端运行脚本不会报模块缺失。
通过双击shell脚本、桌面.desktop图标启动程序时,不会加载交互式shell的配置,系统使用默认全局环境变量,无法识别ROOT模块路径,就会触发ModuleNotFoundError: No Module named 'ROOT';双击.sh无响应本质是脚本启动后立刻因导入错误退出,没有弹出可见错误提示。
修复步骤
- 定位ROOT初始化脚本路径
终端执行which root,会返回类似/opt/root/6.26/06/bin/root的结果,将路径末尾的root替换为thisroot.sh,就是需要加载的环境脚本路径,以上面的返回结果为例,初始化脚本路径为/opt/root/6.26/06/bin/thisroot.sh。 - 重写.sh启动脚本
不要直接调用Python脚本,先加载ROOT环境、切换到脚本所在目录(桌面启动默认工作目录为桌面路径,不是脚本所在目录,容易触发相对路径错误)再执行脚本,参考内容如下:
保存后给sh文件加可执行权限:#!/bin/bash # 替换为你自己查到的thisroot.sh实际路径 source /opt/root/6.26/06/bin/thisroot.sh # 自动切换到当前sh文件所在目录 cd "$(dirname "$0")" # 替换为你的Python脚本实际文件名 /usr/bin/env python3 ./Python_File.pychmod +x /你的sh文件实际路径/Bash_File.sh - 修正.desktop文件配置
不要直接在.desktop中调用.py文件,统一调用修改后的.sh脚本,调试阶段先开启终端显示方便看报错,参考配置如下:
保存后给.desktop文件加可执行权限,可直接右键文件在属性面板勾选“允许作为程序执行”,或终端执行[Desktop Entry] Type=Application Name=数据采集分析工具 Exec=/你的sh文件实际路径/Bash_File.sh # 有自定义图标就填路径,没有可以删掉Icon这行 Icon=/你的图标路径/icon.png # 调试阶段设为true,跑通后改成false就不会弹出黑终端 Terminal=true Categories=Utility;chmod +x /你的desktop文件路径/xxx.desktop。 - 触控适配补充
如果后续tkinter界面出现触控点击无响应、窗口不显示的问题,在.sh文件里source root脚本的下一行加export DISPLAY=:0即可,指定程序输出到当前桌面显示。
验证
保持Terminal=true配置双击图标,若弹出终端后正常加载tkinter界面无报错,即为配置生效,后续将Terminal字段改为false即可实现静默启动,单击图标直接进程序。
内容的提问来源于stack exchange,提问作者Frosty Pookie
相关产品推荐
相关产品推荐

