docs/standalone-apps.md
Briefcase is a tool for packaging Python projects as standalone native applications. It can produce installers and executables for macOS, Windows, and Linux that do not require the user to install Python or any dependencies.
.pkg on macOS, .msi on
Windows, .deb/.rpm on Linux).This page outlines the basics of packaging a Click application with
Briefcase. Be sure to read its
documentation
and use briefcase --help to understand what features are available.
Install Briefcase in the virtual environment:
pip install briefcase
Add a [tool.briefcase] section and a
[tool.briefcase.app.<app-name>] section to pyproject.toml.
Set console_app = true so Briefcase treats the project as a command
line application rather than a GUI application.
Given a Click application with the following project structure:
hello-cli/
src/
hello_cli/
__init__.py
app.py
LICENSE
pyproject.toml
Where app.py contains a Click command:
import click
@click.command()
@click.argument("name", default="World")
@click.option("--count", default=1, help="Number of times to greet.")
def main(name, count):
"""Greet someone by NAME (default: World)."""
for _ in range(count):
click.echo(f"Hello, {name}!")
Add the following Briefcase configuration to pyproject.toml:
[tool.briefcase]
project_name = "Hello CLI"
bundle = "com.example"
version = "0.0.1"
url = "https://example.com/hello-cli"
license.file = "LICENSE"
author = "Your Name"
author_email = "[email protected]"
[tool.briefcase.app.hello-cli]
formal_name = "Hello CLI"
description = "My first application"
long_description = """More details about the app should go here.
"""
sources = [
"src/hello_cli",
]
console_app = true
requires = [
"click",
]
The key settings are:
console_app = true -- tells Briefcase this is a terminal
application, not a GUI.sources -- the list of source packages to include.requires -- the Python dependencies to bundle (Click and any other
libraries the project needs).Briefcase launches the application by running the package with
python -m <package>, so a __main__.py file must exist in the
package. Without it, Briefcase will not be able to start the application.
Create __main__.py in the package directory and call the Click
command:
from hello_cli.app import main
if __name__ == "__main__":
main()
Use briefcase dev to run the application directly from the source
tree. Pass command line arguments after --:
$ briefcase dev -- World
Hello, World!
$ briefcase dev -- World --count 2
Hello, World!
Hello, World!
To create a distributable executable, run the following commands:
briefcase create
briefcase build
briefcase package
briefcase create downloads a Python interpreter and installs
dependencies into an isolated app bundle. briefcase build compiles
the app, and briefcase package produces the final platform installer.
On macOS, this produces a .pkg installer. On Windows, it produces a
.msi installer. On Linux, it produces a system package (.deb,
.rpm, etc.) for the current distribution.
Once installed, users can run the application directly from the terminal:
$ hello-cli World
Hello, World!
$ hello-cli World --count 2
Hello, World!
Hello, World!