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 lives in the docs/ directory (Sphinx / Read the Docs):
- Installation & requirements
- Quick start
- How it works
- Configuration reference
- CLI reference
- Dependency resolution
- Code signing
- Samples
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyappdist-0.1.0.tar.gz.
File metadata
- Download URL: pyappdist-0.1.0.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c2471a461351259d77a6d24b2ea720f9d27035d887c48642aefb996b810f2a4
|
|
| MD5 |
9b40bb659f9be3e8e66c109ef89be4ec
|
|
| BLAKE2b-256 |
e933841cd2a272c3e14740bd8a6349bd57cb30537c4dd1e245f1c7ade1438c89
|
File details
Details for the file pyappdist-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pyappdist-0.1.0-py3-none-any.whl
- Upload date:
- Size: 32.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d25963fee51e7e63c03833a1c8b24ce3a965d676d57117e54fe7894cc762dca
|
|
| MD5 |
2e7347890b4bd448ac87de6c6d65fe7d
|
|
| BLAKE2b-256 |
27a987ec5858e6fe5e0518e73418064e135de9429badabe985df9ef79f90af1e
|