DEV Community

Akhilesh Mishra
Akhilesh Mishra

Posted on • Originally published at livingdevops.com

How to Auto-Generate requirements.txt for Python Projects: Complete Guide to pipreqs and pigar

Stop manually hunting for Python dependencies - automate requirements.txt generation with these powerful tools

Python dependency management tools

As a DevOps engineer, I frequently collaborate with multiple teams, diving into various projects and repositories. One common challenge I face is encountering Python code without a requirements.txt file.

Every time I run such code, I need to figure out and manually install the necessary dependencies. I found it a waste of time and effort. I am sure you guys also feel the same way.

So I dug around, did some Google searches, experimented with a few tools, and found many good ones. My favorites are pipreqs and pigar.

In this comprehensive guide, I'll show you how to use these Python dependency management tools to generate requirements.txt files automatically for any Python project.

Table of Contents

Why Not Use pip freeze?

Before diving into the solutions, let's address why pip freeze isn't always the best choice for generating requirements.txt:

❌ pip freeze problems:

  • Only saves packages installed with pip install in your current environment
  • Includes ALL packages in the environment, even those not used in your project (if you don't use virtualenv)
  • Sometimes you need to create requirements.txt for a new project without installing modules first
  • Can include system-wide packages that aren't relevant to your project

βœ… What we need instead:

  • Tools that analyze your actual Python code
  • Generate requirements based on import statements
  • Create clean, project-specific dependency lists

Method 1: Using pipreqs - The Import-Based Analyzer

What is pipreqs?

pipreqs is a Python tool that analyzes your Python files and generates requirements.txt based on the actual imports in your code. It's smart, fast, and doesn't require installing packages beforehand.

Setting Up Your Environment

I recommend working with isolated Python virtual environments for better dependency management:

# Create a project directory
mkdir python-requirements-demo
cd python-requirements-demo

# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
Enter fullscreen mode Exit fullscreen mode

Installing pipreqs

pip install pipreqs
Enter fullscreen mode Exit fullscreen mode

Practical Example: Word Cloud Generator

Let's create a real Python project to demonstrate pipreqs. Create a directory and file:

mkdir project
cd project
Enter fullscreen mode Exit fullscreen mode

Create word_cloud_generator.py with the following code:

import matplotlib.pyplot as plt
from wordcloud import WordCloud
from collections import Counter
import requests
from PIL import Image
import numpy as np
import argparse
from io import BytesIO

def get_mask_image(url):
    """Download and process mask image from URL"""
    response = requests.get(url)
    img = Image.open(BytesIO(response.content))
    return np.array(img)

def create_word_cloud(text, mask_url=None):
    """Generate word cloud from text with optional mask"""
    if mask_url:
        mask = get_mask_image(mask_url)
    else:
        mask = None

    wordcloud = WordCloud(
        width=800, 
        height=400, 
        background_color='white', 
        mask=mask, 
        contour_width=1, 
        contour_color='black'
    ).generate(text)

    plt.figure(figsize=(10, 5))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.show()

def parse_arguments():
    """Parse command line arguments"""
    parser = argparse.ArgumentParser(description="Generate a word cloud from input text")
    parser.add_argument('--text', '-t', required=True, help="Input text for word cloud")
    parser.add_argument('--mask_url', '-m', help="URL of mask image for word cloud shape")
    return parser.parse_args()

if __name__ == "__main__":
    args = parse_arguments()
    create_word_cloud(args.text, args.mask_url)
Enter fullscreen mode Exit fullscreen mode

Generating requirements.txt with pipreqs

Now comes the magic! Instead of manually figuring out dependencies, run:

# Generate requirements.txt for the project directory
pipreqs project
Enter fullscreen mode Exit fullscreen mode

Output in requirements.txt:

matplotlib==3.9.1
numpy==2.0.0
Pillow==10.4.0
Requests==2.32.3
wordcloud==1.9.3
Enter fullscreen mode Exit fullscreen mode

Installing and Testing Dependencies

# Install all dependencies at once
pip install -r project/requirements.txt

# Test the script
python project/word_cloud_generator.py --text "Python dependency management made easy"

# With mask image
python project/word_cloud_generator.py --text "pipreqs is awesome" --mask_url "https://example.com/mask.jpg"
Enter fullscreen mode Exit fullscreen mode

Advanced pipreqs Options

# Generate requirements for specific directory
pipreqs /path/to/your/project

# Specify output file name
pipreqs . --savepath requirements-dev.txt

# Force overwrite existing requirements.txt
pipreqs . --force

# Use local database for package names
pipreqs . --use-local

# Debug mode for troubleshooting
pipreqs . --debug
Enter fullscreen mode Exit fullscreen mode

Method 2: Using pigar - The Advanced Dependency Scanner

What is pigar?

pigar is another excellent tool for generating Python requirements. It offers more advanced features and better handling of complex projects.

Installing pigar

# Using pip
pip install pigar

# From source (latest features)
pip install git+https://github.com/damnever/pigar.git@main --upgrade

# Using conda
conda install -c conda-forge pigar
Enter fullscreen mode Exit fullscreen mode

Real-World Example: Flask Application

Let's test pigar with a Flask application:

# Clone a sample Flask project
git clone https://github.com/akhileshmishrabiz/Devops-zero-to-hero
cd Devops-zero-to-hero/project5

# Remove existing requirements.txt for demo
rm requirements.txt
Enter fullscreen mode Exit fullscreen mode

Generating requirements with pigar

# Generate requirements.txt for current directory
pigar generate

# Check the generated file
cat requirements.txt
Enter fullscreen mode Exit fullscreen mode

Output:

# Automatically generated by https://github.com/damnever/pigar.

Flask==3.0.3
Flask-SQLAlchemy==3.1.1
Enter fullscreen mode Exit fullscreen mode

Advanced pigar Usage

# Generate requirements for specific directory with custom filename
pigar gen -f custom-requirements.txt /path/to/project

# Example with Python Lambda project
pigar gen -f python-lambda-requirements.txt python-for-devops/python-lambda-runtime/
Enter fullscreen mode Exit fullscreen mode

Output for Lambda project:

# Automatically generated by https://github.com/damnever/pigar.

boto3==1.34.142
colorlog==6.8.2
packaging==24.1
Enter fullscreen mode Exit fullscreen mode

pigar Advanced Features

# Check for outdated packages
pigar check

# Search for packages
pigar search numpy

# Show package information
pigar show requests
Enter fullscreen mode Exit fullscreen mode

Comparison: pipreqs vs pigar

Feature pipreqs pigar
Speed ⚑ Very Fast πŸ”„ Moderate
Accuracy βœ… High βœ… Very High
Local imports ❌ Limited βœ… Excellent
Complex projects βœ… Good βœ… Excellent
Additional features ❌ Basic βœ… Package search, outdated checks
File size πŸ“¦ Lightweight πŸ“¦ Slightly larger

Best Practices for Python Dependency Management

1. Use Virtual Environments

# Always create isolated environments
python -m venv project-env
source project-env/bin/activate
Enter fullscreen mode Exit fullscreen mode

2. Pin Exact Versions

# Good - specific versions
requests==2.32.3
numpy==2.0.0

# Avoid - unpinned versions
requests
numpy
Enter fullscreen mode Exit fullscreen mode

3. Separate Development Dependencies

# Create different requirement files
pigar gen -f requirements.txt .           # Production
pigar gen -f requirements-dev.txt .       # Development
Enter fullscreen mode Exit fullscreen mode

4. Regular Dependency Audits

# Check for security vulnerabilities
pip-audit -r requirements.txt

# Update outdated packages
pip list --outdated
Enter fullscreen mode Exit fullscreen mode

Troubleshooting Common Issues

pipreqs Not Finding All Imports

# Use debug mode
pipreqs . --debug

# Force scan all files
pipreqs . --scan-notebooks
Enter fullscreen mode Exit fullscreen mode

pigar Missing Local Modules

# Include local packages
pigar gen --with-referenced-comments
Enter fullscreen mode Exit fullscreen mode

Version Conflicts

# Generate without version pins
pipreqs . --no-version

# Then manually specify versions
Enter fullscreen mode Exit fullscreen mode

Automation with CI/CD

GitHub Actions Example

name: Check Requirements
on: [push, pull_request]

jobs:
  check-deps:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Generate requirements
      run: |
        pip install pipreqs
        pipreqs . --force
        git diff --exit-code requirements.txt
Enter fullscreen mode Exit fullscreen mode

Conclusion

Both pipreqs and pigar are excellent tools for automating Python dependency management:

  • Choose pipreqs for: Simple projects, fast generation, lightweight solution
  • Choose pigar for: Complex projects, advanced features, comprehensive analysis

Stop wasting time manually managing Python dependencies. These tools will save you hours and reduce deployment errors significantly.

Next Steps

  1. Try both tools on your existing Python projects
  2. Integrate dependency generation into your development workflow
  3. Set up automated checks in your CI/CD pipeline
  4. Share this guide with your team to standardize dependency management

Related Python Articles

Tags

#python #devops #dependencies #automation #pip #requirements #development #productivity #tools #tutorial

Found this helpful? Follow for more Python and DevOps tutorials!

Connect with the author:

Top comments (0)