简体   繁体   中英

packaging python application for linux

I have made a GUI application using python and PyQt5. I want to package this app but there doesn't seems to be a straight forward way to do this. Moreover what I have found answers to is to package a python module and not an application. I have read various articles and the official docs but still don't seem to have a proper answer to this, though there are several workarounds through which I could achieve the same, I just want to know what is the standard way.

This is my directory structure :

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

What do I want to achieve: The user is given with a tar file of Moodly. The user extracts it, runs the command

python setup.py install 

in the terminal, the setup places all the files in the proper place and creates a Moodly.desktop file probably in usr/local/share/applications clicking on which user can run the app.

My way of achieving this:

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

Now with no setup.cfg I run the command:

python setup.py install

This succesfully installs Moodly to /usr/lib/python-3.4/site-packages alongwith the sounds directory.And now from the terminal when I type in moodly(as specified in entry points in setup.py) my GUI application launches successfully.

Now I just need the setup to create the Moodly.desktop alongwith moodly.png in usr/local/share/applications which I am trying to achieve through this:

setup.cfg

[install]
install_data=/usr/local/share/applications

Adding this to setup.py

 data_files = [("Moodly", ["moodly.png","Moodly.desktop",])],

But this somehow seems to copy the files inside python-3.4/site-packages/Moodly rather than the specified destination but it used to work well with distutils

This guy also seems to have faced the same issue

Some other links I have used:

python-packaging

starting with distutils

So the way I am trying to do it , how much of it is correct and what is the standard way to do it. How can I possibly place that Moodly.desktop in the right place or what could be a better alternative way to do the entire process.

Moreover would using Pyinstaller be a better idea. Pyinstaller would package the app with PyQt5, requests and beautifulsoup4 (external modules that I have used) which I don't want. I want to use the install_requires option provided by setuptools and not unnecessary make the user download the modules which they already might have.

The .desktop file isn't supposed to be installed using Distutils. Distutils is only concerned with installing Python packages.

To install .desktop files, icons and other files incidental to distribution level packaging, you should look at build automation systems, such as CMake.

The first step in this process is to get CMake to build a Python project. You should take a look here for how to do that: https://bloerg.net/2012/11/10/cmake-and-distutils.html

Beyond that, installing .desktop files is easy. Assuming you've written a .desktop file and put it somewhere, installing it is a matter of doing:

install(PROGRAMS com.akshay.moodly.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})

in your CMakeLists.txt file.

Note that you install the .desktop file to ${XDG_APPS_INSTALL_DIR} (that's a CMake variable), not a hardcoded path like /usr/local/share/applications or something. The user (and pretty much every automated distro package builder) will always install your package to a temporary path and then copy files over into their packages. Never assume that your app will live in /usr/bin or /usr/local/bin or whatever. The user could install things into /opt/Moodly or even $HOME/Moodly .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM