PyInstaller can be used to create
files for Windows,
.app files for Mac, and distributable packages for Linux.
Optionally, it can create a single file which is more convenient for
distributing, but takes slightly longer to start because it unzip itself.
This tutorial walks through the process of installing and using PyInstaller to create distributable packages.
To install PyInstaller, use
pip and install the
pip install pyinstaller
PyInstaller is not a cross-compiler, so it will only build a package for your current system. So, you must build Windows from Windows, Mac from Mac, and Linux from Linux.
# Build the .exe, .app, or linux executable distribution pyinstaller hello.py # Create only a single file (slower to run, easier to distribute) pyinstaller hello.py -F # Tell application not to launch console (e.g. PyQt5, GTK+, tkinter GUIs) pyinstaller hello.py --noconsole # Specify the icon file to use pyinstaller hello.py --icon=path/to/icon.ico
The output will be in a folder named
Build with .spec file
For more complex builds, it can help to first create a
.spec file which
defines all the files that should be included and any other settings.
You can read more about spec files at https://pythonhosted.org/PyInstaller/spec-files.html.
Generate the .spec file
To generate a
.spec file, use
pyi-makespec which comes with the
pyi-makespec the Python file/application you want to
package and it will generate the spec file.
Note that you can pass all the regular command-line flags that you would
pyi-makespec and it will include those options
in the spec file.
# Create a spec file with all defaults pyi-makespec myapp.py # Or, if you want the final distributable package to be a single file pyi-makespec myapp.py -F # To set the icon pyi-makespec myapp.py --icon=icon.ico # To disable console pyi-makespec myapp.py --noconsole # Combined pyi-makespec myapp.py -F --icon=icon.ico --noconsole
Tweak the .spec file
.spec file to meet your needs.
This may include adding resource files like images, icons, configuration
files, or the Designer
.ui templates. Additionally, you might want
to disable the console if it is a GUI application.
To add arbitrary files, modify the line in the
.spec file that
datas=. It should contain a list of tuples.
Each tuple should contain two values, the file(s) to include,
and the target directory. For example, to include all
templates/ directory in to a
templates/ directory of your
final distributable package, modify the spec file like this:
# Change `datas=` to this: # ... datas=[('templates/*.ui', 'templates')], # ...
If you have a GUI application, such as a PyQt5, Tkinter, PyGame,
or GTK+ application, you might want to disable the console so a window
with the command prompt does not show up in addition to the regular
desired GUI window. You can disable the console by changing
.spec file to
Console=False like this:
# Change `console=True` to False in the `exe` object # ... console=False # ...
Change the file icon
If you need to create a
.ico icon file, you could use one of the following:
Inedo's Icon Maker can be downloaded from the GitHub releases as a
Unzip the file to get
IconMaker.exe. Run it, and drag your image file in to
the window. It accepts up to 256x256 pixel images.
Icoconvert.com allows you to upload an image and get a
.ico file back.
To change the icon that the
.exe has, you can pass the
pyi-makespec command or modify the
.spec file yourself by altering
exe object to add the argument
# Change or add `icon='icon.ico'` to `exe` object # ... icon='path/to/icon.ico' # ...
Build the package
.spec file is up to your standards, use
pyinstaller and pass
.spec file as the first argument. It will use the information
specified in the file to create the final distributable package.
The output will be in the
dist/ folder the same as building without
After reading this tutorial, you should be able to create distributable Python applications using PyInstaller.