Skip to main content

Turn a Python app into a Windows installer(msi)

Project description

pyappdist

Turn a Python app into a Windows installer — and it just works.

⚠️ Alpha. pyappdist is under active development. It works end-to-end today, but the config schema, CLI, and output layout may still change without notice.

pyappdist does not freeze your code. Instead of bundling Python and your app into a single executable (and fighting hidden imports, data files, and plugins along the way), it installs your app into a real, dedicated Python runtime — exactly the way pip would — and ships that.

Because the runtime is a normal Python environment, most apps run as-is: no hooks, no --hidden-import, no --add-data, no per-library workarounds. If it runs under uv run, it almost certainly runs after pyappdist build. C extensions, abi3 wheels, Qt plugins, and tkinter-based GUIs work unmodified because the install layout is real.

Quick start

Add a [tool.pyappdist] section to your app's pyproject.toml:

[tool.pyappdist]
name = "My App"
python = "3.12"
target = "windows-x86_64"

[[tool.pyappdist.launchers]]
name = "myapp"              # produces myapp.exe
entry = "myapp:main"        # module:callable

[tool.pyappdist.wix]
manufacturer = "Example Inc."

Then add pyappdist and build:

uv add --dev pyappdist
uv run pyappdist build .    # wheels -> runtime -> image -> launcher -> wix -> MSI

The result lands under appdist/dist/: a portable .zip and an .msi installer.

Documentation

Full documentation: https://pyappdist.readthedocs.io/en/latest/

Status

Alpha — the pipeline works end-to-end, but expect breaking changes to the config schema, CLI, and output layout as it matures.

Windows x64 is the current target. macOS/Linux packaging, auto-update, and code-signing certificates are out of scope for now. Distributed apps are not obfuscated, and unsigned installers will trigger a SmartScreen warning.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyappdist-0.1.1.tar.gz (22.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyappdist-0.1.1-py3-none-any.whl (32.3 kB view details)

Uploaded Python 3

File details

Details for the file pyappdist-0.1.1.tar.gz.

File metadata

  • Download URL: pyappdist-0.1.1.tar.gz
  • Upload date:
  • Size: 22.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyappdist-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f6692961fcae215797cc4eb086de518d01b00bf343b137ef943b67327e9f49c6
MD5 52ef8cde9c5d9d7842d25eb1b013b6f3
BLAKE2b-256 bd4ac76fa2ae57f2a64acb45fe83c8810f502a13b05791698cccedb110d9f7ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyappdist-0.1.1.tar.gz:

Publisher: publish.yml on atsuoishimoto/pyappdist

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyappdist-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: pyappdist-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 32.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyappdist-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 64e909caa86a34accc0ed75dd7a6238f9bdf0c8d7c33a999f3628a8f867f32f8
MD5 ca65a43bf3830de73bb48305ff81402a
BLAKE2b-256 2fb6eca7107893d6f761e2b6bcdbc6ea48c4985b61592805b895349d90f275b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyappdist-0.1.1-py3-none-any.whl:

Publisher: publish.yml on atsuoishimoto/pyappdist

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page