xsetuper
xsetuper creates standalone executables from Python scripts, with the same performance as the original script. It is cross-platform and should work on any platform that Python runs on.
Features
- Cross-platform: Windows, macOS, Linux
- Built-in GUI — manage, configure and build projects visually; no extra dependencies (uses tkinter from the standard library)
- Fast builds with optimized module discovery
- Simple CLI:
xsetuper --script myapp.pyto freeze pyproject.tomlconfiguration support- GUI and console application support
- MSI, DMG, AppImage, DEB, RPM installer generation
- Automatic dependency detection
Graphical Interface
xsetuper ships with a full graphical interface — no extra packages to install:
xsetuper gui
# or
xsetuper-gui
# or open a specific project folder
xsetuper-gui /path/to/project
The GUI provides:
- Project manager — save/load projects (
.xsetuper.json) and exportpyproject.toml - Recent projects list with one-click reopening
- Multiple executables per project, with icon, base (console/gui), manifest, shortcut and UAC options
- Module control — include/exclude lists, packages, build constants
- Files & zip control — extra data files, zip include/exclude packages, path replacement
- Smart setup — analyzes your script's imports and suggests include/exclude lists
- Quickstart wizard — two questions and your project is ready
- One-click build with live console output, cancel support, and post-build actions (run app / open output folder)
- Installer creation — MSI, DMG, AppImage, DEB, RPM toggles run automatically after build (per platform)
- Dark / light themes with automatic system detection
Installation
pip install xsetuper
Or with conda:
conda install -c conda-forge xsetuper
Quick Start
CLI Usage
The simplest way to freeze your Python application:
xsetuper --script myapp.py
This creates a standalone executable in build/exe.<platform>-<python-version>/.
Common CLI Options
# Specify output directory
xsetuper --script myapp.py --target-dir dist/
# Set custom executable name
xsetuper --script myapp.py --target-name MyApp
# Include an icon
xsetuper --script myapp.py --icon icon.ico
# GUI application (no console window on Windows)
xsetuper --script myapp.py --base gui
# Build with optimization
xsetuper build_exe --optimize=2
pyproject.toml Configuration
Add your freeze configuration directly in pyproject.toml:
[tool.xsetuper.build_exe]
excludes = ["tkinter", "unittest"]
includes = ["my_package"]
optimize = 1
silent = false
[[tool.xsetuper.executables]]
script = "myapp.py"
base = "gui"
target_name = "MyApp"
icon = "icon.ico"
Then build with:
xsetuper build_exe
Python API
from xsetuper import setup, Executable
setup(
name="MyApp",
version="1.0",
description="My Application",
executables=[
Executable(
"myapp.py",
base="gui",
target_name="MyApp",
icon="icon.ico",
)
],
)
Creating Installers
Windows (MSI)
xsetuper bdist_msi
macOS (DMG)
xsetuper bdist_dmg
Linux (AppImage)
xsetuper bdist_appimage
Linux (DEB)
xsetuper bdist_deb
Advanced Usage
Excluding Modules
[tool.xsetuper.build_exe]
excludes = [
"tkinter",
"unittest",
"email",
"xml",
"pydoc",
]
Including Data Files
[tool.xsetuper.build_exe]
include_files = [
("data/", "data/"),
("config.json", "config.json"),
]
Optimizing the Build
[tool.xsetuper.build_exe]
optimize = 2 # Maximum optimization (removes docstrings)
no_compress = false
zip_include_packages = ["encodings"]
Development
git clone https://github.com/ifekri/xsetuper.git
cd xsetuper
pip install -e ".[dev]"
Running Tests
pytest tests/ -v
Coverage
pytest tests/ --cov=xsetuper --cov-report=term-missing
License
MIT License. See LICENSE for 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 xsetuper-1.0.0.tar.gz.
File metadata
- Download URL: xsetuper-1.0.0.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b615a4a93770d46b34af6f649623acf83e4c8014e7007887d8b17904a73fcef5
|
|
| MD5 |
bd578c543a47a2945f334c5152dbabbd
|
|
| BLAKE2b-256 |
58f693be8ec094b3ffc999a5891975fe4bc965910dc12acab13e44f0da78803a
|
Provenance
The following attestation bundles were made for xsetuper-1.0.0.tar.gz:
Publisher:
build-wheel.yml on ifekri/xsetuper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xsetuper-1.0.0.tar.gz -
Subject digest:
b615a4a93770d46b34af6f649623acf83e4c8014e7007887d8b17904a73fcef5 - Sigstore transparency entry: 2499756207
- Sigstore integration time:
-
Permalink:
ifekri/xsetuper@f27bf7e89da1e9f79c09c6022a74cbbaae709cd5 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/ifekri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheel.yml@f27bf7e89da1e9f79c09c6022a74cbbaae709cd5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file xsetuper-1.0.0-py3-none-any.whl.
File metadata
- Download URL: xsetuper-1.0.0-py3-none-any.whl
- Upload date:
- Size: 3.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8bec493dddf7d8cd6cf054e3948dcd84b83bf5cef80c0ce9af0ecaa26ccd66ec
|
|
| MD5 |
0ec9d407606f32e8571ffb87b16fecc0
|
|
| BLAKE2b-256 |
d057a5d3440def1943a8bf260034ced1c70a10b63ab1c514e9c0f0f869d69283
|
Provenance
The following attestation bundles were made for xsetuper-1.0.0-py3-none-any.whl:
Publisher:
build-wheel.yml on ifekri/xsetuper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xsetuper-1.0.0-py3-none-any.whl -
Subject digest:
8bec493dddf7d8cd6cf054e3948dcd84b83bf5cef80c0ce9af0ecaa26ccd66ec - Sigstore transparency entry: 2499756212
- Sigstore integration time:
-
Permalink:
ifekri/xsetuper@f27bf7e89da1e9f79c09c6022a74cbbaae709cd5 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/ifekri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheel.yml@f27bf7e89da1e9f79c09c6022a74cbbaae709cd5 -
Trigger Event:
release
-
Statement type: