为linux打包python应用程序

为linux打包python应用程序,python,linux,pyqt,setuptools,distutils,Python,Linux,Pyqt,Setuptools,Distutils,我使用python和PyQt5制作了一个GUI应用程序。我想包装这个应用程序,但似乎没有一个直接的方法来做到这一点。此外,我找到的答案是打包一个python模块,而不是一个应用程序。我已经阅读了各种文章和官方文件,但似乎仍然没有一个正确的答案,虽然有几个变通方法,我可以实现同样的,我只是想知道什么是标准的方法 这是我的目录结构: Moodly/ Moodly/ __init__.py controller.py logic.py

我使用python和PyQt5制作了一个GUI应用程序。我想包装这个应用程序,但似乎没有一个直接的方法来做到这一点。此外,我找到的答案是打包一个python模块,而不是一个应用程序。我已经阅读了各种文章和官方文件,但似乎仍然没有一个正确的答案,虽然有几个变通方法,我可以实现同样的,我只是想知道什么是标准的方法

这是我的目录结构:

Moodly/
    Moodly/
        __init__.py
        controller.py
        logic.py
        models.py
        view.py
        resoure.py
        style.py

        sounds/
             notify.wav
             message.wav

    setup.py
    MANIFEST.in
    setup.cfg
    run.py
    moodly.png
    Moodly.desktop
我想实现什么:给用户一个Moodly的tar文件。用户提取它,运行命令

python setup.py install 
在终端中,安装程序会将所有文件放置在适当的位置,并创建一个Moodly.desktop文件,该文件可能位于usr/local/share/applications中,单击用户可以运行应用程序的位置

我实现这一目标的方法:

setup.py

from setuptools import setup

setup(

name="Moodly",

version="1.0",

author="Akshay Agarwal",

author_email="agarwal.akshay.akshay8@gmail.com",

packages=["Moodly"],

include_package_data=True ,

url="http://github.com/AkshayAgarwal007/Moodly",

entry_points = {
          'gui_scripts': [
              'moodly = Moodly.controller:main',
          ],
      },

# license="LICENSE.txt",

description="Student Intimation system",

# long_description=open("README.txt").read(),

# Dependent packages (distributions)
)
MANIFEST.in

include Moodly/sounds/notify.wav
include Moodly/sounds/message.wav
现在,在没有setup.cfg的情况下,我运行以下命令:

python setup.py install
这将成功地将Moodly安装到/usr/lib/python-3.4/site-packages 现在,当我输入moody(如setup.py中的入口点所指定)时,我的GUI应用程序从终端成功启动

现在,我只需要设置在usr/local/share/applications中创建Moodly.desktop和Moodly.png,我正试图通过以下方式实现:

setup.cfg

[install]
install_data=/usr/local/share/applications
将此添加到setup.py

 data_files = [("Moodly", ["moodly.png","Moodly.desktop",])],
但这似乎以某种方式复制了python-3.4/site-packages/Moodly中的文件,而不是指定的目标,但它过去在distutils中工作得很好

我使用过的其他一些链接:

所以我尝试的方法,有多少是正确的,标准的方法是什么。我怎样才能把Moodly.desktop放在正确的位置,或者用什么更好的方法来完成整个过程


此外,使用Pyinstaller是一个更好的主意。Pyinstaller会用我不想要的PyQt5、requests和beautifulsoup4(我使用过的外部模块)打包应用程序。我想使用setuptools提供的install_requires选项,并且不需要让用户下载他们可能已经拥有的模块。

不应该使用Distutils安装.desktop文件。Distutils只与安装Python包有关

要安装.desktop文件、图标和分发级打包附带的其他文件,您应该查看构建自动化系统,例如CMake

这个过程的第一步是让CMake构建一个Python项目。您应该在这里了解如何做到这一点:

除此之外,安装.desktop文件也很容易。假设您已经编写了一个.desktop文件并将其放在某个地方,那么安装它只需执行以下操作:

install(PROGRAMS com.akshay.moodly.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
在您的CMakeLists.txt文件中

请注意,将.desktop文件安装到
${XDG\u APPS\u install\u DIR}
(这是一个CMake变量),而不是像
/usr/local/share/applications
之类的硬编码路径。用户(以及几乎所有的自动发行版软件包生成器)总是将您的软件包安装到一个临时路径,然后将文件复制到他们的软件包中。永远不要假设你的应用程序将生活在
/usr/bin
/usr/local/bin
或任何地方。用户可以将东西安装到
/opt/Moodly
甚至
$HOME/Moodly