single |
# pipdeptree
[PyPI]
[Supported Python
versions]
[Downloads]
[check]
[![pre-commit.ci
status]](https://results.pre-commit.ci/latest/github/tox-dev/pipdeptree/main)
`pipdeptree` is a command line utility for displaying the installed python
packages in form of a dependency tree. It
works for packages installed globally on a machine as well as in a
virtualenv. Since `pip freeze` shows all dependencies
as a flat list, finding out which are the top level packages and which
packages do they depend on requires some effort.
It\'s also tedious to resolve conflicting dependencies that could have been
installed because older version of `pip`
didn\'t have true dependency resolution[^1]. `pipdeptree` can help here by
identifying conflicting dependencies
installed in the environment.
To some extent, `pipdeptree` is inspired by the `lein deps :tree` command
of [Leiningen].
## Installation
`bash
pip install pipdeptree
`
## Running in virtualenvs
`New in ver. 2.0.0`
If you want to run pipdeptree in the context of a particular virtualenv,
you can specify the `--python` option. Note
that this capability has been recently added in version `2.0.0`.
Alternatively, you may also install pipdeptree inside the virtualenv and
then run it from there.
As of version `2.21.0`, you may also pass `--python auto`, where it will
attempt to detect your virtual environment and grab the interpreter from
there. It will fail if it is unable to detect one.
## Usage and examples
To give you a brief idea, here is the output of `pipdeptree` compared with
`pip freeze`:
```bash
$ pip freeze
Flask==0.10.1
itsdangerous==0.24
Jinja2==2.11.2
-e
git+git@github.com:naiquevin/lookupy.git@cdbe30c160e1c29802df75e145ea4ad903c05386#egg=Lookupy
MarkupSafe==0.22
pipdeptree @ file:///private/tmp/pipdeptree-2.0.0b1-py3-none-any.whl
Werkzeug==0.11.2
```
And now see what `pipdeptree` outputs,
```bash
$ pipdeptree
Warning!!! Possibly conflicting dependencies found:
* Jinja2==2.11.2
- MarkupSafe [required: >=0.23, installed: 0.22]
------------------------------------------------------------------------
Flask==0.10.1
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.11.2]
- MarkupSafe [required: >=0.23, installed: 0.22]
- Werkzeug [required: >=0.7, installed: 0.11.2]
Lookupy==0.1
pipdeptree==2.0.0b1
- pip [required: >=6.0.0, installed: 20.1.1]
setuptools==47.1.1
wheel==0.34.2
```
## Is it possible to find out why a particular package is installed?
`New in ver. 0.5.0`
Yes, there\'s a `--reverse` (or simply `-r`) flag for this. To find out
which packages depend on a particular
package(s), it can be combined with `--packages` option as follows:
```bash
$ pipdeptree --reverse --packages itsdangerous,MarkupSafe
Warning!!! Possibly conflicting dependencies found:
* Jinja2==2.11.2
- MarkupSafe [required: >=0.23, installed: 0.22]
------------------------------------------------------------------------
itsdangerous==0.24
- Flask==0.10.1 [requires: itsdangerous>=0.21]
MarkupSafe==0.22
|