我有一个python脚本文件,当我从终端使用它时,它可以完美地工作。
现在我创建了以下.desktop
文件,以便轻松启动它:
[Desktop Entry]
Name=Test
GenericName=Test
Comment=My test script
Type=Application
Exec=/opt/test.py
Icon=/opt/test.png
Categories=Utils;
当我启动它时,GTK窗口会出现,但单击调用init.d脚本的按钮会使它无法正常工作。
因此,添加Terminal=true
可以使它完美地工作,但我不想打开那个终端。
因此,我放了以下代码来记录环境变量:
import os
with open("/tmp/py_env.log", "w") as env_log:
env_log.write(str(os.environ))
并发现了差异。
因此,我的问题是如何编写.desktop文件,以便我的应用程序像从终端启动一样运行(没有打开的终端:)
这个问题是有效的,但我认为"复制终端环境"是解决它的错误方法
事实上,使应用程序工作的并不是它是从终端启动的,而是终端<em]碰巧有一些对应用程序重要的环境变量>。
因此,您的目标应该是始终正确设置这些环境变量,而不是假设所有用户的终端环境总是包含它们。
因此,您应该:
- 检查两种环境之间的环境变量不同
- 列出那些重要的东西(即那些能使
.desktop
文件正常工作的东西),以及它们的值对于脚本的工作需要是什么 - 两者之一:
- 为Python脚本创建一个包装器脚本,该脚本将正确初始化这些环境变量,或者
- 从Python脚本本身内部设置这些环境变量
这个问题类似于从桌面快捷方式调用shell脚本时不读取.bashrc
- 在
~/.bash_profile
中初始化环境,而不是~/.bashrc
或
- 使
*.desktop
文件调用一个包装器,该包装器初始化环境-例如通过采购~/.bashrc
(或任何脚本现在负责)
第二种解决方案更具体(不会影响shell的所有其他不相关的启动),因此应该首选。
感谢所有参与此问题的人。
我已经通过实现使用pkexec
而不是gksudo
来解决这个问题。pkexec
似乎重用了当前的用户环境,那么我就不再有这个问题了。
谢谢。