用setup.py安装.desktop文件

9 投票
2 回答
2350 浏览
提问于 2025-04-18 17:08

我有一个Python应用程序,应该可以通过图形界面启动,所以它需要在/usr/share/applications/目录下有一个.desktop文件。这个应用程序只支持Linux系统。通常情况下,pip会把所有文件安装到一个目录里,但我们可以在setup.py文件中使用data_files=[]来指定其他位置(比如.desktop文件)。

在这种情况下,这样做算是一个好办法吗?还是说这应该只在特定的发行版包里进行(比如.rpm/.deb/.ebuild)?

2 个回答

9

是的,你可以在你的 setup.py 脚本中定义 .desktop 文件的安装路径。

你之所以可以这样做,是因为你知道自己想把它安装在哪里,这个路径并不是特定于某个发行版的。它是根据 Freedesktop 规范 大致定义的。

通常,桌面文件会放在以下这些目录中:

  • /usr/share/applications
  • /usr/local/share/applications
  • ~/.local/share/applications

虽然没有明确的参考资料说明这一点,但如果你想了解更多,可以查看 桌面条目规范XDG 基目录规范

所以你知道想把它安装到 share/applications。但在这之前的 前缀 是什么呢?答案是,作为开发者的你不需要关心这个。这个由打包者来决定。

那么,下面是你在 setup.py 中怎么做的。

from setuptools import setup

setup(
    name       = 'myapplication',
    version    = '0.1',
    packages   = ['myapplication'],
    data_files = [
        ('share/applications', ['data/org.myapplication.desktop']),
    ],
)

如你所见,我们给出的目录(share/applications)是 相对路径。引用 Python 的 编写设置脚本 的说明:

如果目录是相对路径,它会相对于 安装前缀 进行解释(对于纯 Python 包来说是 Python 的 sys.prefix,对于包含扩展模块的包则是 sys.exec_prefix)。

多亏了这一点,当打包者设置安装前缀(通常是 /usr/usr/local)时,你的桌面文件就会安装到正确的位置。


顺便提一下,关于桌面文件,确保阅读一下关于 命名规范 的部分:

... 应该遵循 "反向 DNS" 规范,例如 org.example.FooViewer.desktop。

另外,和这页上说的相反,在你的文件的 Exec 行中并不需要绝对路径。看看你系统上安装的文件,几乎没有人这么做。

grep Exec= /usr/share/applications/*.desktop
1

我觉得这个方法不错,但或许你可以把 .desktop 文件放在用户自己的应用程序文件夹里,也就是 ~/.local/share/applications,而不是放在系统的 /usr/share/applications/ 文件夹里。

这样做的话,就不需要更高的权限去访问那些属于根目录的 /user 目录和它的子目录了。

撰写回答