Can I use `pip` instead of `easy_install` for `python setup.py install` dependency resolution?
pip
instead of easy_install
for python setup.py install
dependency resolution? with practical examples, diagrams, and best practices. Covers python, easy-install, pip developm...Categories:
Replacing easy_install
with pip
for python setup.py install
Dependencies

Explore how pip
can effectively manage dependencies for setup.py install
and understand the historical context of easy_install
.
For many years, easy_install
was the go-to tool for installing Python packages. However, with the advent of pip
, the Python packaging landscape significantly evolved. While easy_install
could handle dependencies when running python setup.py install
, pip
has emerged as the preferred and more robust solution. This article delves into how pip
can be used for dependency resolution in this context, the reasons behind its superiority, and best practices for modern Python development.
The Role of easy_install
and Its Limitations
easy_install
was part of the setuptools
project and was one of the earliest tools to provide automated package installation and dependency resolution for Python. When you ran python setup.py install
, setuptools
would often invoke easy_install
internally to fetch and install any declared dependencies. While revolutionary for its time, easy_install
had several drawbacks:
- No uninstallation: It lacked a straightforward way to uninstall packages.
- No package integrity checks: It didn't verify package integrity (e.g., using hashes).
- Limited dependency resolution: Its dependency resolver was less sophisticated than
pip
's, sometimes leading to conflicts. - Direct installation of eggs: It primarily installed packages as
.egg
files, which were less flexible thanpip
's wheel-based installations.
flowchart TD A[User runs `python setup.py install`] B{`setuptools` processes `setup.py`} C{Are there dependencies?} D[Invoke `easy_install` (Historically)] E[Fetch and install dependencies] F[Install main package] G[Installation Complete] A --> B B --> C C -- Yes --> D D --> E E --> F C -- No --> F F --> G
Historical Dependency Resolution Flow with easy_install
Transitioning to pip
for Dependency Management
pip
is the de facto standard package installer for Python. It addresses many of easy_install
's shortcomings and offers a more reliable and feature-rich experience. While pip
is primarily used for installing packages from PyPI or other sources, it also plays a crucial role in managing dependencies for local projects, including those using setup.py
.
When you run python setup.py install
, setuptools
will still handle the installation of your project. However, for its dependencies, setuptools
is now much more likely to use pip
internally or recommend its use. The modern approach is to declare dependencies in setup.py
(or pyproject.toml
) and then use pip
to install the project in 'editable' mode or directly from the source directory, which allows pip
to handle all dependency resolution.
# setup.py example with dependencies
from setuptools import setup, find_packages
setup(
name='my_project',
version='0.1.0',
packages=find_packages(),
install_requires=[
'requests>=2.20.0',
'numpy',
'pandas'
],
# ... other metadata
)
Example setup.py
declaring install_requires
.
pyproject.toml
and build
for packaging, and pip install .
for installation, as this is the modern and recommended approach over directly invoking python setup.py install
.Modern Dependency Resolution with pip
Instead of relying on setup.py
to implicitly invoke easy_install
or pip
for dependencies, the recommended workflow is to explicitly use pip
to install your project and its dependencies. This gives you more control and leverages pip
's advanced features.
Here's how pip
handles dependencies for a project with a setup.py
file:
pip install .
: When you runpip install .
(orpip install -e .
for editable mode) in a directory containingsetup.py
,pip
reads theinstall_requires
(and potentiallysetup_requires
,tests_require
, etc.) from yoursetup.py
.- Dependency Resolution:
pip
then uses its sophisticated dependency resolver to determine the correct versions of all required packages, avoiding conflicts where possible. - Installation:
pip
downloads and installs these dependencies (usually as wheels) into your Python environment. - Project Installation: Finally,
pip
installs your project itself, either as a wheel or in editable mode, ensuring all dependencies are met.
flowchart TD A[User runs `pip install .`] B{`pip` reads `setup.py` (or `pyproject.toml`)} C[Identify `install_requires`] D[Resolve dependencies (using `pip`'s resolver)] E[Download and install dependencies] F[Install main project] G[Installation Complete] A --> B B --> C C --> D D --> E E --> F F --> G
Modern Dependency Resolution Flow with pip
# Install your project and its dependencies using pip
pip install .
# Install your project in editable mode (for development)
pip install -e .
Using pip
to install a local project and its dependencies.
easy_install
and pip
in the same environment, as this can lead to package conflicts and unexpected behavior. Always prefer pip
.