The requirements.txt file is a cornerstone of reproducible Python development. It serves as a manifest, detailing all the external Python packages a project depends on, along with their specific versions. This ensures that any developer can recreate the exact environment needed for the project to run, preventing the common “it works on my machine” syndrome. Mastering the use of requirements.txt is essential for effective collaboration, deployment, and maintaining the integrity of your software.
Understanding the requirements.txt File
At its core, a requirements.txt file is a simple text file where each line specifies a package that your project needs. This allows for precise control over dependencies, which is crucial for stability and predictability.

Package Specification Formats
The most basic format involves simply listing the package name. For instance:
requests
numpy
pandas
This will install the latest available versions of requests, numpy, and pandas from the Python Package Index (PyPI). However, relying on the latest versions can introduce compatibility issues if newer versions contain breaking changes. Therefore, it’s best practice to pin specific versions.
Pinning Specific Versions
To ensure reproducibility, you should always specify the exact versions of the packages you are using. This is done by appending == followed by the version number to the package name:
requests==2.28.1
numpy==1.23.3
pandas==1.5.1
This guarantees that when someone else runs the installation, they will get precisely these versions, regardless of what newer versions might be available.
Version Specifiers
Beyond exact version matching, requirements.txt supports various version specifiers to offer flexibility while maintaining control:
- Greater than or equal to (
>=):django>=3.2– Installs Django version 3.2 or any later version. - Less than or equal to (
<=):flask<=2.1.2– Installs Flask version 2.1.2 or any earlier version. - Compatible with (
~=):sqlalchemy~=1.4.0– This is a common and recommended specifier. It means “greater than or equal to 1.4.0 and less than 1.5.0”. It allows for patch updates within a minor version, which are generally backward-compatible. - Excluding specific versions (
!=):package_name!=1.2.3– Installs any version ofpackage_nameexcept for 1.2.3. - Greater than (
>):pylint>2.10.0– Installs any version of Pylint strictly greater than 2.10.0. - Less than (
<):pytest<7.0– Installs any version of Pytest strictly less than 7.0.
You can also combine these specifiers. For example, requests>=2.20,<3.0 would install a version of requests that is at least 2.20 but less than 3.0.
Handling Development Dependencies
Often, a project has dependencies that are only needed for development (e.g., linters, testing frameworks) and not for the application to run in production. These can be managed by having separate requirements.txt files. A common convention is to have requirements.txt for production and requirements-dev.txt for development dependencies.
Including Local Packages
requirements.txt can also reference local packages. This is particularly useful when developing multiple related Python packages.
- Editable installs:
-e .or-e /path/to/your/local/package– This installs a package in “editable” mode. Changes made to the source code of the local package will be immediately reflected without needing to reinstall, which is invaluable during development.
Comments
Lines starting with # are treated as comments and are ignored by pip. This is useful for adding explanations or temporarily excluding dependencies.
# Core web framework
django==3.2.10
# Data manipulation and analysis
# pandas==1.5.1 # Temporarily disabled for testing
# Development tools
pytest==7.1.2
flake8==5.0.4
Generating requirements.txt
There are several ways to generate or update your requirements.txt file. The most straightforward method is to use pip freeze.
Using pip freeze
The pip freeze command outputs all installed packages in the current Python environment in the requirements.txt format.
Basic Usage
To generate a requirements.txt file for your current environment, navigate to your project’s root directory in your terminal and run:
pip freeze > requirements.txt
This command will create or overwrite a file named requirements.txt in your current directory with a list of all installed packages and their exact versions.
Best Practices for pip freeze
- Virtual Environments: Always use a virtual environment for your project. This isolates your project’s dependencies from your system’s Python installation and other projects. Before running
pip freeze, ensure your virtual environment is activated. - Clean Environment: For the most accurate
requirements.txt, start with a clean virtual environment. Install only the necessary packages for your project and then runpip freeze. This avoids including extraneous packages that were installed for unrelated tasks. - Regular Updates: Periodically update your
requirements.txtfile as you add or update dependencies. This keeps your manifest current.
Manual Creation and Maintenance
While pip freeze is convenient, it can sometimes include packages that are not strictly project dependencies but were installed as transitive dependencies of other packages, or even packages installed globally if a virtual environment isn’t used correctly. For cleaner, more intentional dependency management, manual creation or careful editing of requirements.txt is often preferred.
You can create the file manually and add each dependency with its pinned version. This approach offers more control and clarity.
Installing from requirements.txt
Once you have a requirements.txt file, installing the specified dependencies is a simple pip command.
The pip install -r Command
The primary command for installing from a requirements.txt file is:
pip install -r requirements.txt
This command instructs pip to read the requirements.txt file, parse each line, and install the specified packages and versions into the current Python environment.
Step-by-Step Installation Process
-
Activate Virtual Environment: Ensure your project’s virtual environment is activated.
- On macOS and Linux:
source venv/bin/activate(assuming your virtual environment is namedvenv) - On Windows:
venvScriptsactivate
- On macOS and Linux:
-
Navigate to Project Directory: Change your terminal’s current directory to the root of your project, where the
requirements.txtfile is located. -
Run the Installation Command: Execute the following command:
bash
pip install -r requirements.txt
pip will then download and install all the listed packages. If a package is already installed and matches the specified version, pip will typically skip it.
Handling Different Requirements Files
If you have multiple requirements.txt files (e.g., requirements.txt for production and requirements-dev.txt for development), you can install them separately:
# Install production dependencies
pip install -r requirements.txt
# Install development dependencies
pip install -r requirements-dev.txt
This is a common pattern for managing different sets of dependencies for various deployment stages or development needs.
Common Installation Scenarios and Troubleshooting
- Network Issues: Ensure you have a stable internet connection, as
pipneeds to download packages from PyPI. Firewall or proxy settings might also interfere. - Permission Errors: If you encounter permission errors, it might indicate that you are trying to install packages globally without sufficient privileges, or that your virtual environment is not set up correctly. Always ensure you are working within an activated virtual environment.
- Version Conflicts: Occasionally, even with pinned versions, conflicts can arise if one package requires a version of a dependency that another package explicitly forbids or requires a different, incompatible version.
pipwill usually report these conflicts. Resolving them might involve carefully adjusting versions in yourrequirements.txtfile or seeking compatible versions of the conflicting packages. - Build Dependencies: Some Python packages, especially those with C extensions, require build tools and development headers to be installed on your system. If
pipfails during installation with errors related to compilation, you might need to install system-level packages (e.g.,build-essentialon Debian/Ubuntu, Xcode Command Line Tools on macOS). - Outdated
piporsetuptools: It’s good practice to keeppipandsetuptoolsupdated within your virtual environment before installing project dependencies:
bash
pip install --upgrade pip setuptools
Advanced requirements.txt Usage
Beyond basic installation, requirements.txt supports more sophisticated configurations for managing complex dependency trees.
Including VCS (Version Control System) Links
pip can install packages directly from version control systems like Git. This is useful for installing development versions of packages or packages not yet published to PyPI.
# Install from a Git repository
git+https://github.com/psf/requests.git@main#egg=requests
# Install a specific commit
git+https://github.com/psf/requests.git@a1b2c3d4e5f67890abcdef1234567890abcdef@main#egg=requests
# Install from a private repository (using SSH)
git+ssh://git@github.com/your_username/your_private_repo.git@main#egg=your_package
The #egg=<package_name> part is important for pip to correctly identify the package name.
Including Local Directory or Archive Links
You can also specify packages from local directories or archives.
# Install from a local directory (using editable mode)
-e ../path/to/another/local_project
# Install from a local zipped archive
/path/to/my_package-1.0.0.zip
# Install from a local unpacked directory
/path/to/my_package_unpacked/
Using requirements.txt with Different Environments
The flexibility of requirements.txt allows it to be used across various deployment environments, from local development machines to production servers and continuous integration (CI) pipelines.
Development Environments
As discussed, requirements-dev.txt is common for tools like linters (flake8, pylint), formatters (black, isort), testing frameworks (pytest), and debugging tools.
Production Environments
The main requirements.txt should only contain the packages necessary for the application to run. This minimizes the attack surface, reduces installation time, and ensures a lean deployment.
Continuous Integration (CI)
In CI/CD pipelines, requirements.txt is critical for setting up a consistent build and test environment. The CI server will typically activate a Python environment, install dependencies using pip install -r requirements.txt, and then run tests or build the application.
Best Practices for Managing Dependencies
Effective dependency management goes beyond simply creating and installing from requirements.txt. It involves a proactive approach to maintain a healthy and secure project environment.
Regular Auditing and Updating
- Security Vulnerabilities: Regularly audit your dependencies for known security vulnerabilities. Tools like
pip-auditorsafetycan help scan yourrequirements.txtfile or installed packages for issues. - Dependency Hell: Keep your dependencies updated to avoid “dependency hell,” where conflicting package versions make it impossible to upgrade. Regularly update your
requirements.txtby installing the latest compatible versions and re-generating the file. - Deprecations: Be mindful of deprecation warnings in your dependencies. Updating proactively allows you to adapt to API changes before they become breaking changes.
Version Pinning Strategies
While pinning exact versions (==) offers maximum reproducibility, it can sometimes make updates more cumbersome. Consider these strategies:
- Strict Pinning (
==): Best for production environments and for ensuring absolute reproducibility across all installations. - Compatible Versioning (
~=): A good balance for development dependencies, allowing for minor and patch updates that are less likely to break your application. - Minimum Versioning (
>=): Use sparingly, typically only when a core dependency has a significant feature or fix that you absolutely need and you are confident in handling potential future breaking changes.

Automating Dependency Management
Leverage tools to automate parts of the dependency management process:
- Dependabot/Renovate: These services can automatically create pull requests to update your dependencies based on security advisories or new releases.
- Poetry/Pipenv: While not directly related to
requirements.txt, these tools offer more integrated dependency management solutions with lock files (poetry.lock,Pipfile.lock) that provide even stronger reproducibility thanrequirements.txt. They often can export torequirements.txtif needed.
By diligently managing your requirements.txt file, you ensure that your Python projects are robust, reproducible, and secure, facilitating smoother development, deployment, and collaboration.
