Linux 桌面文件 Exec 不使用用户会话



我有一个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]碰巧有一些对应用程序重要的环境变量>

因此,您的目标应该是始终正确设置这些环境变量,而不是假设所有用户的终端环境总是包含它们

因此,您应该:

  1. 检查两种环境之间的环境变量不同
  2. 列出那些重要的东西(即那些能使.desktop文件正常工作的东西),以及它们的值对于脚本的工作需要是什么
  3. 两者之一:
    • 为Python脚本创建一个包装器脚本,该脚本将正确初始化这些环境变量,或者
    • 从Python脚本本身内部设置这些环境变量

这个问题类似于从桌面快捷方式调用shell脚本时不读取.bashrc

  • ~/.bash_profile中初始化环境,而不是~/.bashrc

  • 使*.desktop文件调用一个包装器,该包装器初始化环境-例如通过采购~/.bashrc(或任何脚本现在负责)

第二种解决方案更具体(不会影响shell的所有其他不相关的启动),因此应该首选。

感谢所有参与此问题的人。

我已经通过实现使用pkexec而不是gksudo来解决这个问题。pkexec似乎重用了当前的用户环境,那么我就不再有这个问题了。

谢谢。

最新更新