Qt for Python Deployment

Deploying or freezing an application is an important part of a Python project, this means to bundle all required resources so that the application finds everything it needs to be able to run on a client’s machine. However, because most large projects aren’t based on a single Python file, distributing these applications can be a challenge.

Here are a few distribution options that you can use:
  1. Send a normal ZIP file with the application’s content.

  2. Build a proper Python package (wheel).

  3. Freeze the application into a single binary file or directory.

  4. Provide native installer (msi, dmg)

If you choose Option 3, consider using one of these tools:

Since Qt for Python is a cross-platform framework, we focus on solutions for the three major platforms that Qt supports: Windows, Linux, and macOS.

The following table summarizes the platform support for those packaging tools:

Name License Qt 6 Qt 5 Linux macOS Windows

fbs

GPL

yes

yes

yes

yes

PyInstaller

GPL

partial

yes

yes

yes

yes

cx_Freeze

MIT

yes

yes

yes

yes

yes

py2exe

MIT

partial

partial

no

no

yes

py2app

MIT

yes

yes

no

yes

no

briefcase

BSD3

no

yes

yes

yes

yes

Nuitka

MIT

yes

yes

yes

yes

yes

Notice that only fbs, cx_Freeze, briefcase, and PyInstaller meet our cross-platform requirement.

Since these are command-line tools, you’ll need special hooks or scripts to handle resources such as images, icons, and meta-information, before adding them to your package. Additionally, these tools don’t offer a mechanism to update your application packages.

To create update packages, use the PyUpdater, which is a tool built around PyInstaller.

The fbs tool offers a nice UI for the user to install the application step-by-step.

Note

Deployment is supported only from Qt for Python 5.12.2 and later.

Here’s a set of tutorials on how to use these tools: