使用setup.py安装.desktop文件

ely*_*ya5 6 python linux pip

我有一个python应用程序,应该可以通过GUI启动,所以它必须在/ usr/share/applications /中有一个.desktop文件.该应用程序仅支持Linux.通常,pip会将所有文件安装在一个目录中,但可以使用data_files = []在setup.py中指定其他位置(例如.desktop文件).

在这种情况下,这被认为是一个很好的解决方案,还是应该只在特定于发行版的包中发生(例如.rpm/.deb/.ebuild)?

elb*_*ero 8

是的,您可以.desktopsetup.py脚本中定义您的安装路径。

您可以这样做,因为您知道要安装它的位置,它不是特定于发行版的。它由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']),
    ],
)
Run Code Online (Sandbox Code Playgroud)

如您所见,我们给出的目录 ( share/applications) 是相对的。引用 Pythons 的编写设置脚本

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

多亏了这一点,当打包程序设置安装前缀(通常是/usr/usr/local)时,您的桌面文件将安装在正确的位置。


顺便说一句,谈到桌面文件,请务必阅读有关命名约定的部分:

... 应遵循“反向 DNS”约定,例如 org.example.FooViewer.desktop。

顺便说一句,与本页所说的相反,Exec文件行中不需要绝对路径。看看你系统上安装的文件,几乎没有人这样做。

grep Exec= /usr/share/applications/*.desktop
Run Code Online (Sandbox Code Playgroud)


Lix*_*Lix 1

在我看来,这听起来是一个很好的方法,但也许您可以将文件放在用户应用程序文件夹中,而不是将文件放在.desktop系统范围的文件夹中。/usr/share/applications/~/.local/share/applications

这也不需要提升权限来访问根拥有的/user目录及其子目录。

  • 但是,您可能需要提供可执行文件的完整路径,因为您的桌面 shell 可能不会显示 .desktop 文件,而 Exec 行无法“统计”。GNOME Shell 就是这么做的。所以我认为接下来的问题是:如何让 setuptools 替换它安装的 .desktop 文件的 `Exec` 行中的路径? (3认同)