Update Python Package versions in requirements.txt with exact versions from pip freeze
A command-line tool that updates existing packages in requirements.txt with their exact versions from pip freeze, without adding new packages. Perfect for keeping your requirements.txt files up-to-date with your current environment.
- β Safe Updates: Only updates existing packages, never adds new ones
- β Preserves Formatting: Maintains package order, comments, and empty lines
- β Smart Version Handling: Supports all version specifiers (>=, <, ~, etc.)
- β
Package Extras: Correctly handles packages with extras (e.g.,
Flask[async]
) - β Dry Run Mode: Preview changes before applying them
- β Enhanced Dry Run: Shows complete updated requirements.txt content
- β Error Handling: Warns about packages not found in pip freeze
- β Cross-Platform: Works on macOS, Linux, and Windows
brew install abozaralizadeh/brew/pipup
pip install requp
Note: After installation, you can use either pipup
or requp
commands - they work identically!
git clone https://github.com/abozaralizadeh/pipup.git
cd pipup
pip install -e .
pip install git+https://github.com/abozaralizadeh/pipup.git
pipup # Update requirements.txt (default)
# or
requp # Update requirements.txt (default)
pipup --dry-run # Preview changes to requirements.txt
# or
requp --dry-run # Preview changes to requirements.txt
pipup -U # Update to latest versions from PyPI
pipup -U --dry-run # Preview latest version updates
pipup requirements-dev.txt -U # Update specific file to latest
# or use requp instead of pipup
pipup requirements-dev.txt # Update specific file
pipup requirements-prod.txt # Update specific file
pipup requirements-test.txt # Update specific file
# or use requp instead of pipup
pipup --help
pipup --version
# or
requp --help
requp --version
Pipup supports special comment conventions to control which packages get updated:
# This package should not be updated
#skip-pipup
requests==2.31.0
# Or use the requp alias
#skip-requp
Flask>=2.0.0
# Everything below this line should be ignored
#stop-pipup
pydantic==1.10.15
azure-storage-blob==12.19.1
# This comment will also be preserved
#skip-pipup
or#skip-requp
- Skip the next package line#stop-pipup
or#stop-requp
- Skip all remaining lines
The -U
or --upgrade
flag updates packages to their latest versions from PyPI instead of using the versions from pip freeze
. This is useful when you want to:
- Update to latest: Get the newest versions of all packages
- Stay current: Keep your dependencies up-to-date
- Test compatibility: Check if your code works with latest versions
Note: Skip and stop conventions work the same way in upgrade mode, giving you fine-grained control over which packages get updated.
requests
Flask>=2.0.0
langchain
pydantic>=1.0.0,<2.0.0
# This is a comment
azure-storage-blob
Flask[async]
duckduckgo-search
requests==2.32.4
Flask==3.1.1
langchain==0.3.27
pydantic==2.11.7
# This is a comment
azure-storage-blob==12.26.0
Flask[async]==3.1.1
duckduckgo-search
$ pipup --dry-run
Running pip freeze...
Found 246 installed packages
Dry run: Updating test_requirements.txt...
Warning: flask not found in pip freeze, keeping original specification
Warning: duckduckgo-search not found in pip freeze, keeping original specification
Dry run: Would update 4 packages
Packages not found in pip freeze: flask, duckduckgo-search
Updated requirements.txt content:
--------------------------------------------------
requests==2.31.0
Flask>=2.0.0
langchain==0.0.329
pydantic==1.10.15
# This is a comment
azure-storage-blob==12.19.1
Flask[async]
duckduckgo-search
--------------------------------------------------
- Runs pip freeze to get all installed packages with exact versions
- Parses requirements.txt line by line, preserving formatting and comments
- Matches packages by name (case-insensitive) and handles extras
- Updates version specifiers to exact versions (==) from pip freeze
- Preserves everything else (comments, empty lines, package order, warnings)
Pipup handles all standard pip version specifiers:
Specifier | Example | Result |
---|---|---|
No version | requests |
requests==2.32.4 |
Exact version | requests==1.0.0 |
requests==2.32.4 |
Minimum version | requests>=1.0.0 |
requests==2.32.4 |
Maximum version | requests<3.0.0 |
requests==2.32.4 |
Version range | requests>=1.0.0,<3.0.0 |
requests==2.32.4 |
Compatible release | requests~=1.0.0 |
requests==2.32.4 |
Exclusion | requests!=1.0.0 |
requests==2.32.4 |
Pipup correctly handles packages with extras:
# Before
Flask[async]
requests[security]
django[postgresql]
# After
Flask[async]==3.1.1
requests[security]==2.32.4
django[postgresql]==4.2.7
- Missing requirements.txt: Exits with clear error message
- Package not found: Warns and keeps original specification
- pip not found: Exits with helpful error message
- Invalid requirements.txt: Preserves malformed lines as-is
- Permission errors: Clear error messages for file access issues
git clone https://github.com/abozaralizadeh/pipup.git
cd pipup
pip install -e .
python -m pytest tests/
python -m build
- Upgrade Mode: Added
-U
/--upgrade
flag to update to latest PyPI versions - PyPI Integration: Get latest package versions directly from PyPI
- Skip Conventions: Skip and stop conventions work with upgrade mode
- Enhanced Control: Fine-grained control over which packages get updated
- Homebrew Migration: Changed from
abozaralizadeh/tap/pipup
toabozaralizadeh/brew/pipup
- Better Naming: More standard Homebrew tap naming convention
- Improved Documentation: Updated all installation instructions
- Default File: Added default value for requirements.txt file
- Simplified Usage: Can now run
pipup
orrequp
without specifying file - Skip Conventions: Added
#skip-pipup
/#skip-requp
and#stop-pipup
/#stop-requp
comments - Fine-grained Control: Users can now skip individual packages or all remaining packages
- Better UX: More intuitive for common use case
- Updated Documentation: Examples now show default behavior and skip conventions
- GitHub Permissions: Fixed GitHub Actions release permissions
- Release Attachments: Added built packages to GitHub releases
- Better Permissions: Added explicit contents: write permissions
- Improved Workflow: Enhanced CI/CD pipeline reliability
- CI/CD Fixes: Fixed GitHub Actions build and upload process
- Build Verification: Added steps to verify dist/ contents before upload
- Clean Builds: Ensures fresh builds without cached files
- Better Debugging: Added logging to track build process
- Workflow Fixes: Fixed GitHub Actions release workflow permissions
- Modern Actions: Updated to use
softprops/action-gh-release@v1
- Auto Changelog: Added automatic release notes generation
- Better Reliability: Improved CI/CD pipeline stability
- Command Alias: Added
requp
as an alias command for PyPI users - Dual Commands: Users can now use either
pipup
orrequp
commands - Enhanced Documentation: Updated README with comprehensive examples and badges
- Improved Workflow: Fixed GitHub Actions release workflow
- Better User Experience: More intuitive for users installing from PyPI
- PyPI Package Name: Changed to
requp
to avoid naming conflicts - Enhanced Dry Run: Now shows complete updated requirements.txt content
- Improved Documentation: Better examples and clearer instructions
- Homebrew Support: Added Homebrew installation via repository
- Enhanced Dry Run: Added display of updated requirements.txt content
- Better Error Messages: Improved warning and error output
- Documentation Updates: Added comprehensive examples
- Initial Release: Basic package version updating
- Dry Run Mode: Preview changes before applying
- Version Specifier Support: All standard pip version specifiers
- Package Extras Support: Handles packages with extras correctly
- Cross-Platform: Works on macOS, Linux, and Windows
We welcome contributions! Please see our Contributing Guidelines for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Make your changes
- Add tests if applicable
- Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Inspired by the need for safe requirements.txt updates
- Built with Python's excellent packaging tools
- Thanks to all contributors and users
- Issues: GitHub Issues
- Discussions: [GitHub Discussions](https://github.com/abozaralizadeh/pipup/
Made with β€οΈ for the Python community