用setup.py安装.desktop文件
我有一个Python应用程序,应该可以通过图形界面启动,所以它需要在/usr/share/applications/目录下有一个.desktop文件。这个应用程序只支持Linux系统。通常情况下,pip会把所有文件安装到一个目录里,但我们可以在setup.py文件中使用data_files=[]来指定其他位置(比如.desktop文件)。
在这种情况下,这样做算是一个好办法吗?还是说这应该只在特定的发行版包里进行(比如.rpm/.deb/.ebuild)?
2 个回答
是的,你可以在你的 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
我觉得这个方法不错,但或许你可以把 .desktop
文件放在用户自己的应用程序文件夹里,也就是 ~/.local/share/applications
,而不是放在系统的 /usr/share/applications/
文件夹里。
这样做的话,就不需要更高的权限去访问那些属于根目录的 /user
目录和它的子目录了。