Python 使用setup.py安装.desktop文件

Python 使用setup.py安装.desktop文件,python,linux,pip,Python,Linux,Pip,我有一个python应用程序,应该可以通过GUI启动,因此它必须在/usr/share/applications/中有一个.desktop文件。该应用程序仅支持Linux。通常,pip将所有文件安装在一个目录中,但也可以使用data_files=[]在setup.py中指定其他位置(例如.desktop文件) 在这种情况下,这被认为是一个很好的解决方案,还是应该只在特定于发行版的软件包(如.rpm/.deb/.ebuild)中发生这种情况?我觉得这是一个很好的方法,但可能不是将.desktop文

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


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

我觉得这是一个很好的方法,但可能不是将
.desktop
文件放在系统范围的
/usr/share/applications/
文件夹中,您可以将该文件放在用户应用程序文件夹中的
~/.local/share/applications


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

是的,您可以在
setup.py
脚本中定义
.desktop
的安装路径

您可以这样做,因为您知道要安装它的位置,它不是特定于发行版的。它的定义是松散的

通常,桌面文件位于以下目录中:

  • /usr/share/applications
  • /usr/local/share/applications
  • ~/.local/share/applications
实际上没有任何参考文献说明这一点,但如果您想了解更多信息,可以查看和

因此,您知道要在
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的sys.prefix,包含扩展模块的包的sys.exec_prefix)

因此,当打包机设置安装前缀(通常是
/usr
/usr/local
)时,您的桌面文件将安装在正确的位置


顺便说一句,谈到桌面文件,请务必阅读以下部分:

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

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

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

但是,您可能需要提供可执行文件的完整路径,因为桌面shell可能不会显示。桌面文件的Exec行不能是
stat
ed。GNOME shell会这样做。因此,我认为接下来的问题是:如何让setuptools替换它安装的.desktop文件的
Exec
行中的路径?@FrederickNord:你是对的,不过,
Exec
的状态可能是“仅用可执行文件的名称”指定的。我觉得这很奇怪。作为一种解决方法,以下方法对我来说很好:
Exec=bash-c'export PATH=“$PATH:~/.local/bin”;某些可执行文件%U'
的好处是,某些可执行文件的位置可能位于用户的本地树中,也可能位于全局路径中。