问题描述
背景
- 用 PyQt4 写了个软件,主要功能已经完成
- 依赖 conda+OpenCV2 等等重型模块
- 好在已经完成可调用 .sh
-
在 GNOME Terminal 中直接使用
-
$ /path/2/myGUI.sh
形式 - 可以执行, 并弹出 PyQt4 软件窗口
-
目标
- 将 python 运行的 GUI 软件变成标准桌面图标
- 用户双击图标, 即可弹出 PyQt4 构建的软件窗口
-
环境:
- Ubuntu 18.04.2 LTS
- conda 4.6.12
- Python 2.7.15
- opencv 2.4.11
- qt 4.8.7
- sip 4.18
- ...
问题出现的环境背景及自己尝试过哪些方法
尝试
根据: How to create desktop shortcut launcher on Ubuntu 18.04 Bionic Beaver Linux - LinuxConfig.org
手工或是使用 gnome-desktop-item-edit 创建 .desktop 声明,
都可以在桌面形成标准软件图标;
但是, 双击没任何反应,
并没形成 .sh 中记录的运行时日志
两种方式构建的 .desktop 主要差异只是首行是否有
#!/usr/bin/env xdg-open
根据: desktop - How to launch shell script with double click in CentOS 7 - Unix & Linux Stack Exchange
这里建议可以直接链接脚本本身
$ cd $HOME/Desktop
$ ln -s $HOME/bin/myscript.sh MyScript
只是没图标, 也可以接受,
但是,按照文章完成了部署,
到桌面点击依然没任何反应
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
其中 .desktop 声明文件中尝试过:
Exec=/path/2/myGUI.sh
Exec=gnome-terminal -e "bash -c '/path/2/myGUI.sh;$SHELL'"
Exec=gnome-terminal -e "bash -c '/path/2/myGUI.sh'"
Exec=gnome-terminal -e "bash /path/2/myGUI.sh"
Exec=bash /path/2/myGUI.sh
Exec=sh /path/2/myGUI.sh
都不能正常运行, 弹出 PyQt4 构建的软件界面
你期待的结果是什么?实际看到的错误信息又是什么?
分析
参考: How to Create a .Desktop File For Your Application in Linux - Make Tech Easier
-
发现先决条件是在资源管理器中 right click 可以 run
- 才能最终用标准 .desktop 图标来调用;
-
测试发现当前自己写的 .sh 用这种形式无法运行;
- 这可能是桌面图标无反应的原因;
那么当前问题就变成:
-
终端中人工输入路径可以运行的 .sh 文件
- 已经用 chmod a+x 指定可运行属性
-
为什么, 在 Files (GNOME 资源管理器)中, 右键菜单无法正常运行?
- 以及这种情况, 如何调试 .sh ?
refer
launcher - How to execute a script just by double clicking like .EXE files in Windows? - Ask Ubuntu
发现这种套在终端中运行的形式
Exec=gnome-terminal -e "bash -c './script.sh;$SHELL'"
解决原先脚本运行时参数问题;
[FAQ]有关点击 Ubuntu 桌面图标运行 shell 脚本 - V2EX (5)
https://www.v2ex.com/t/566460...
已经解决, 果然不是 .desktop 的声明问题,
而是那个 .sh 的运行问题;
因为, 通过 .desktop 运行时, 其实和 crontab 运行的 shell 一样
才发现:
解决方法也很囧:
export 依赖路径_ROOT="/path/2/约定的程序安装目录"
以上...
可以说, 这是 Linux 对桌面环境视之为一个沙箱的安全控制策略了.