A fast, efficient command-line tool to create, manage, and deploy Python projects. Written in Rust with cross-platform support for Windows, macOS, and Linux.
- Features
- Quick Start
- Installation
- Commands
- Project Configuration
- Project Structure
- Examples
- Cross-Platform Support
- Build From Source
- Contributing
- License
β¨ Core Features:
- ποΈ Project Creation - Scaffold new Python projects with proper structure
- π¦ Package Management - Add, remove, and update Python packages with pip integration
- π§ Virtual Environment Management - Automatic venv creation and management
- π Configuration Management - TOML-based project configuration
- π Script Management - Create and run custom project scripts
- π Requirements Generation - Auto-generate requirements.txt from project configuration
- π Package Updates - Update all packages to their latest versions
- π·οΈ Version Control - Automatic semantic version bumping (major, minor, patch)
- β Cross-Platform - Works seamlessly on Windows, macOS, and Linux
- β‘ Performance - Optimized Rust implementation with zero runtime dependencies
- π Lock File Support - Automatic
ppmm.lockgeneration for reproducible builds
ppmm new my-project
cd my-project
ppmm startcd existing-project
ppmm init
ppmm add numpy pandas
ppmm startppmm add requests flask
ppmm add beautifulsoup4==4.9.0ppmm startppmm run test
ppmm run buildHere are the most commonly used ppmm commands:
| Command | Description |
|---|---|
ppmm new <name> |
Create a new Python project |
ppmm init |
Initialize ppmm in current directory |
ppmm add <package> |
Add and install packages |
ppmm rm <package> |
Remove installed packages |
ppmm update |
Update all packages |
ppmm list |
List configured packages |
ppmm start |
Run the main project script |
ppmm run <script> |
Run custom script from project.toml |
ppmm build |
Run build script |
ppmm bump patch/minor/major |
Bump project version |
ppmm gen |
Generate requirements.txt |
ppmm install |
Install dependencies |
ppmm lock lock |
Resolve and pin dependencies |
ppmm lock install |
Install via lock/requirements workflow |
ppmm lock update |
Check or apply dependency updates |
ppmm lock audit |
Scan dependencies for vulnerabilities |
ppmm info |
Show project details |
ppmm doctor |
Diagnose environment issues |
Install directly from crates.io:
cargo install ppmmbrew tap Sumangal44/ppmm
brew install ppmm# Coming soon - waiting for bucket submission
scoop bucket add ppmm https://github.com/Sumangal44/ppmm
scoop install ppmmDownload pre-built binaries from GitHub Releases:
Linux:
# Download and install
curl -L https://github.com/Sumangal44/ppmm/releases/latest/download/ppmm-linux-x64 -o ppmm
chmod +x ppmm
sudo mv ppmm /usr/local/bin/
ppmm --versionmacOS (Intel x86_64):
curl -L https://github.com/Sumangal44/ppmm/releases/latest/download/ppmm-macos-x64 -o ppmm
chmod +x ppmm
sudo mv ppmm /usr/local/bin/
ppmm --versionmacOS (Apple Silicon / ARM64):
curl -L https://github.com/Sumangal44/ppmm/releases/latest/download/ppmm-macos-arm64 -o ppmm
chmod +x ppmm
sudo mv ppmm /usr/local/bin/
ppmm --versionWindows:
# Download from releases page and add to PATH
# Or use the installer executableFrom the repository root run:
git clone https://github.com/Sumangal44/ppmm.git
cd ppmm
bash install.shThis uses install.sh to check prerequisites, build, and place ppmm in /usr/local/bin (prompts for sudo if needed).
bash <(curl -s https://raw.githubusercontent.com/Sumangal44/ppmm/master/quick-install.sh)Or run locally: bash quick-install.sh after cloning. Script lives at quick-install.sh.
Requirements: Rust 1.60+, Python 3.7+, Git.
git clone https://github.com/Sumangal44/ppmm.git
cd ppmm
cargo build --release
# Linux/macOS
sudo cp target/release/ppmm /usr/local/bin/
# Windows (PowerShell/CMD)
copy target\release\ppmm.exe C:\\Windows\\System32\\ # or add target\release to PATH
ppmm --versionBinary output: target/release/ppmm (or ppmm.exe on Windows).
Create a new Python project with scaffolding.
Options:
-v, --version <VERSION>- Project version (default:0.1.0)-d, --description <DESC>- Project description-g, --git- Initialize git repository-e, --no-venv- Skip virtual environment creation
Examples:
# Create basic project
ppmm new my-project
# Create with metadata and git
ppmm new my-project -v 1.0.0 -d "My awesome project" -g
# Create without venv
ppmm new my-project --no-venvInitialize a Python project in the current directory.
Options:
- Same as
ppmm new
Examples:
# Initialize in current directory
ppmm init
# Initialize with git
ppmm init -gAdd one or more packages to the project.
Features:
- Installs to virtual environment automatically
- Supports version pinning (e.g.,
package==1.2.3) - Updates
project.tomlautomatically - Validates package names
Examples:
# Add multiple packages
ppmm add requests flask numpy
# Add specific versions
ppmm add django==3.2.0 pillow==9.0.0
# Mix and match
ppmm add requests flask==2.0.0 numpyRemove packages from the project and environment.
Features:
- Removes from virtual environment
- Updates
project.toml - Validates package existence
Examples:
ppmm rm requests
ppmm rm flask numpy pandasUpdate all packages to their latest versions from PyPI.
Features:
- Fetches latest versions from PyPI API
- Updates all packages atomically
- Reports failed updates
Examples:
ppmm updateExecute a custom script defined in project.toml.
Features:
- Cross-platform command execution
- Access to virtual environment
- Real-time output streaming
Examples:
ppmm run test
ppmm run build
ppmm run devRun the build script defined in the [scripts] section of project.toml.
Features:
- Uses the project's virtual environment on PATH
- Cross-platform execution (
cmdon Windows,sh -con Linux/macOS) - Warns if
scripts.buildis not defined
Examples:
# Ensure project.toml contains:
# [scripts]
# build = "python setup.py build"
ppmm buildAutomatically bump the project version following semantic versioning.
Arguments:
major- Increment major version (1.0.0 β 2.0.0)minor- Increment minor version (1.0.0 β 1.1.0)patch- Increment patch version (1.0.0 β 1.0.1)
This command updates the version field in project.toml automatically.
Features:
- Parses semantic versions (major.minor.patch)
- Strips alpha/beta suffixes before bumping
- Updates project.toml automatically
- Shows colored version bump info
Examples:
# Bump patch version
ppmm bump patch
# Bump minor version
ppmm bump minor
# Bump major version
ppmm bump majorDisplay comprehensive project information.
Shows:
- Project name, version, description
- Python version in use
- All configured scripts
- All installed packages (up to 10 with count)
Example Output:
Python: 3.9.0
Project: my-project
Version: 1.0.0
Description: An awesome project
-- 4 Scripts --
test: python -m pytest tests/
build: python setup.py build
dev: python -m flask run
upgrade: python -m pip install --upgrade pip
-- 5 Packages --
flask==2.1.0
numpy==1.21.0
pandas==1.3.0
requests==2.26.0
pytest==6.2.0
Generate a requirements.txt file from project.toml.
Features:
- Extracts all packages and versions
- Creates standard requirements.txt format
- Overwrites existing requirements.txt
Examples:
ppmm gen
# Equivalent to: pip freeze > requirements.txtInstall all packages from project.toml.
Features:
- Creates venv if missing
- Batch installs all packages
- Validates all packages exist
Options:
-r, --requirements <FILE>- Install from requirements.txt instead
Examples:
# Install from project.toml
ppmm install
# Install from requirements.txt
ppmm install -r requirements.txt
ppmm install --requirements /path/to/reqs.txtRun diagnostics to verify your project and environment setup.
Checks:
- Presence of
project.toml - Virtual environment (
venv) and its Python - System Python installation
- pip availability
Usage:
ppmm doctorPPMM uses TOML for project configuration. Here's the complete format:
[project]
name = "my-project"
version = "1.0.0"
description = "An awesome Python project"
main_script = "./src/main.py"
[packages]
# Production dependencies
requests = "2.28.0"
flask = "2.1.0"
numpy = "1.21.0"
[scripts]
# Custom scripts
test = "python -m pytest tests/ -v"
lint = "python -m pylint src/"
format = "python -m black src/"
build = "python setup.py build"
dev = "python -m flask run --debug"
upgrade-pip = "python -m pip install --upgrade pip"| Field | Type | Required | Description |
|---|---|---|---|
project.name |
String | Yes | Project name |
project.version |
String | Yes | Project version (semver) |
project.description |
String | No | Project description |
project.main_script |
String | Yes | Entry point script |
packages.<name> |
String | No | Package with version |
scripts.<name> |
String | No | Command to execute |
PPMM creates the following structure for new projects:
my-project/
βββ project.toml # Project configuration
βββ requirements.txt # Auto-generated dependencies
βββ venv/ # Virtual environment
β βββ bin/ # Executables (Linux/macOS)
β βββ Scripts/ # Executables (Windows)
β βββ lib/ # Installed packages
βββ src/
β βββ main.py # Entry point
βββ .gitignore # Git ignore (if -g flag used)
# Create project
ppmm new api-server -v 1.0.0 -d "REST API server" -g
# Add dependencies
ppmm add flask flask-cors flask-sqlalchemy
# Create scripts
# Edit project.toml to add:
# [scripts]
# dev = "python -m flask run"
# prod = "gunicorn main:app"
# Start development
ppmm start# Create project
ppmm new data-analysis -d "Data analysis project"
# Add data science packages
ppmm add pandas numpy scipy matplotlib scikit-learn jupyter
# Generate requirements for sharing
ppmm gen
# Update all packages
ppmm update# Convert existing project
cd my-existing-project
ppmm init -g
# Install from existing requirements
ppmm install -r requirements.txt
# Generate new project config
ppmm genPPMM is fully cross-platform and tested on:
- Windows - Full support,
.exeextensions handled automatically - macOS - Full support, uses
bin/for venv - Linux - Full support, uses
bin/for venv
The tool automatically detects your platform and uses the correct paths and commands.
| Platform | Python Path | Pip Path |
|---|---|---|
| Windows | ./venv/Scripts/python.exe |
./venv/Scripts/pip.exe |
| Linux/macOS | ./venv/bin/python |
./venv/bin/pip |
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Python 3.7+
# From: https://www.python.org/downloads/git clone https://github.com/Sumangal44/ppmm
cd ppmm
# Build debug version
cargo build
# Build optimized release version
cargo build --release
# Run tests
cargo test
# Check all bash scripts for syntax errors
bash ./scripts/check-scripts.sh
# Run clippy linter
cargo clippyBinary location: target/release/ppmm (or ppmm.exe on Windows)
# Run directly from source
cargo run -- new my-project
# Debug mode with verbose output
RUST_LOG=debug cargo run -- new my-project
# Watch mode (requires cargo-watch)
cargo watch -x build- Python 3.7 or newer
- pip (comes with Python)
- Rust 1.60 or newer
- Cargo (comes with Rust)
- Git (for version control)
- Project scaffolding with automatic structure
- Virtual environment management
- Package installation/removal
- Package update checking from PyPI
- Script execution
- Requirements.txt generation
- Cross-platform support (Windows, macOS, Linux)
- TOML configuration
- Git integration (optional)
- Error handling and validation
- Package name validation
- Improved error messages
- Cross-platform path handling
- Lock file support (
ppmm.lock)
- Dependency resolution
- Dev dependencies separation
- Python version management
- Project templates
- Virtual environment isolation validation
- Package conflict detection
- Installation progress bar
- Caching of PyPI responses
Problem: "Virtual Environment Not Found"
Solutions:
- Create venv:
ppmm new my-project(auto-creates) - Manually create:
python -m venv venv - Use
--no-venvflag if intentional
Problem: "Package 'X' failed to install"
Solutions:
- Check package name spelling
- Verify package existence on PyPI: visit
https://pypi.org/project/<package>/in your browser - Check pip version:
pip --version - Update pip:
ppmm run upgrade-pip
Problem: "python command not found"
Solutions:
- Ensure Python is installed
- Add Python to PATH
- Use absolute path in scripts
Windows:
- Use forward slashes in
project.toml(scripts:"python -m pytest tests/") - Paths are normalized automatically
Linux/macOS:
- Ensure execute permissions:
chmod +x venv/bin/python
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Rust conventions (rustfmt)
- Pass clippy linter checks
- Add tests for new features
- Update documentation
This project is licensed under the MIT License - see the LICENSE file for details.
sumangal44 - Original Creator
Based on the PPM concept for streamlined Python project management.
Thanks to these amazing people for improving ppmm! π
- Built with Rust
- Uses Clap for CLI parsing
- Uses TOML for configuration
- Uses Reqwest for PyPI API
- Uses Colored for terminal colors
For issues, questions, or suggestions:
- Open an Issue
- Check Discussions
- Read the Wiki
- β
Added
ppmm buildcommand for project builds - β
Added
ppmm bumpcommand for semantic versioning (major, minor, patch) - β Automatic version control and management
- β Install script with prerequisites checking
- β Quick one-liner installer support
- β Updated documentation and examples
- β Initial release
- β Cross-platform support
- β Package management
- β Virtual environment management
- β Script execution
- β Requirements generation
- β Improved error handling
- β TOML configuration
- β Optimized Rust codebase
- β Zero clippy warnings
- β Production-ready
Made with β€οΈ in Rust