Skip to main content

Pyreload CLI 🔄

Pyreload

PyPI version Python versions License Coverage

Python Watchdog Docker Vagrant Pytest Black

A modern, easy-to-use package to automatically restart Python applications when file changes are detected. Perfect for development workflows with full support for Docker, Vagrant, and mounted filesystems via polling mode.

✨ Features

  • 🚀 Zero-config reloading - Works with Python files by default
  • 📂 Polling mode - Solves mounted filesystem limitations (Docker, Vagrant, CIFS/NFS)
  • 🎯 Flexible patterns - Watch and ignore patterns with glob support
  • ⚙️ Config file support - .pyreloadrc or pyreload.json for team settings
  • 🧹 Clean mode - No logs, no prompts for production-like testing
  • 🔧 Exec mode - Run any shell command, not just Python files
  • ⌨️ Manual control - Type rs to restart, stop to exit

🚀 Quickstart (30 seconds)

pip install pyreload-cli
pyreload app.py

That's it! Your app will restart automatically when Python files change.

Using with Docker/Vagrant

If you're developing inside Docker, Vagrant, or using mounted filesystems:

pyreload app.py --polling

The --polling flag enables filesystem polling, which works reliably with mounted volumes where OS-level file events don't propagate.

📖 Usage

Basic Examples

# Watch Python files (default)
pyreload app.py

# Watch multiple patterns
pyreload app.py -w "*.py" -w "*.yaml" -w "config/*.json"

# Ignore patterns
pyreload app.py -i "*__pycache__*" -i "*.log" -i ".git/*"

# Use polling for Docker/Vagrant
pyreload app.py --polling

# Execute shell command instead
pyreload -x "npm run dev"

# Debug mode - see file changes
pyreload app.py --debug

# Clean mode - no logs
pyreload app.py --clean

Interactive Commands

When pyreload is running, you can use these commands:

  • Type rs and press Enter to manually restart
  • Type stop and press Enter to exit
  • Press Ctrl+C to exit immediately

Configuration File

Create a .pyreloadrc or pyreload.json in your project root:

{
  "watch": ["*.py", "config/*.yaml"],
  "ignore": ["*__pycache__*", "*.log", ".git/*"],
  "debug": false,
  "clean": false,
  "exec": false,
  "polling": false
}

Command-line arguments always override config file settings.

🐳 Docker & Vagrant Workflows

Why Polling Mode?

Standard file watching uses OS-level events (like inotify on Linux). These events don't propagate through mounted volumes. When you edit a file on your host machine and it syncs to a Docker container or Vagrant VM, the kernel inside the container/VM never receives the file change event.

Polling mode solves this by directly checking file modification times at regular intervals instead of relying on OS events.

Docker Example

# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["pyreload", "app.py", "--polling"]
# docker-compose.yml
services:
  app:
    build: .
    volumes:
      - .:/app
    command: pyreload app.py --polling

Vagrant Example

# Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"
  config.vm.synced_folder ".", "/vagrant"

  config.vm.provision "shell", inline: <<-SHELL
    pip install pyreload
    cd /vagrant
    pyreload app.py --polling
  SHELL
end

📋 Command-Line Options

Option Short Description Default
--version -V Show version and exit -
--watch <pattern> -w Path/pattern to watch (can be used multiple times) *.py
--ignore <pattern> -i Pattern to ignore (can be used multiple times) -
--polling -p Use polling-based file watching false
--debug -d Log detected file changes false
--clean -c No logs, no commands (quiet mode) false
--exec -x Execute shell command instead of Python file false

🔍 Pattern Matching

Pyreload uses glob patterns for matching files:

  • *.py - All Python files in current directory
  • src/*.py - Python files in src directory
  • src/**/*.py - Python files in src and subdirectories
  • config/*.{yaml,yml,json} - Config files (use multiple -w flags)
  • *__pycache__* - Ignore Python cache (use with -i)

🆚 Comparison with Similar Tools

Feature Pyreload py-mon nodemon
Python-native
Polling mode
Config file
Docker/Vagrant support ⚠️ Limited
Zero dependencies*
Exec mode

*Excluding watchdog and colorama

🤝 Contributing

Contributions are welcome! This project is open source.

Development Setup

git clone https://github.com/dotbrains/pyreload-cli-cli.git
cd pyreload-cli

# Quick setup (installs pre-commit hooks)
./setup-dev.sh

# Or manual setup
python3 -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pre-commit install

Run Tests

pytest

Format Code

Pre-commit hooks will automatically format on commit. To run manually:

pre-commit run --all-files
# Or manually:
black .
ruff check --fix .

📄 License

MIT License - see LICENSE file for details.

🔗 Links

💡 Inspiration

Inspired by py-mon and nodemon, built to solve the mounted filesystem limitation with polling support.


Made with ❤️ by dotbrains

Download files

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

Source Distribution

pyreload_cli-1.0.3.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

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

pyreload_cli-1.0.3-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

Details for the file pyreload_cli-1.0.3.tar.gz.

File metadata

  • Download URL: pyreload_cli-1.0.3.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for pyreload_cli-1.0.3.tar.gz
Algorithm Hash digest
SHA256 341fac654759e2f470c74919c4fbab06849aca6293a28f40f0fb6b7636dcc3bb
MD5 99ad4ac8dee9ffe1e25084ad3a89dc0f
BLAKE2b-256 f93e48835d220a49adbb288afd8d2f9e0c9eff65c2e5b9d8ef00dde139821cf2

See more details on using hashes here.

File details

Details for the file pyreload_cli-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: pyreload_cli-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 10.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for pyreload_cli-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0a09fc0e32b71b8ea6a3a55b6dcf928cb5a4c3538b939344f0829936e3b21725
MD5 7a6eb222baf5f0752f660cf2c560d9bb
BLAKE2b-256 dc9438a8e94f8856dfc0ee6eb6ef905b0a2c144177a5127ba58e2e75dc35fe8a

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Supported by

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