177

I have a project with multiple package dependencies, the main requirements being listed in requirements.txt. When I call pip freeze it prints the currently installed packages as plain list. I would prefer to also get their dependency relationships, something like this:

Flask==0.9
    Jinja2==2.7
    Werkzeug==0.8.3

Jinja2==2.7

Werkzeug==0.8.3

Flask-Admin==1.0.6
    Flask==0.9
    Jinja2==2.7
    Werkzeug==0.8.3

The goal is to detect the dependencies of each specific package:

Werkzeug==0.8.3
    Flask==0.9
    Flask-Admin==1.0.6

And insert these into my current requirements.txt. For example, for this input:

Flask==0.9
Flask-Admin==1.0.6
Werkzeug==0.8.3

I would like to get:

Flask==0.9
    Jinja2==2.7
Flask-Admin==1.0.6
Werkzeug==0.8.3

Is there any way show the dependencies of installed pip packages?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
tbicr
  • 24,790
  • 12
  • 81
  • 106

4 Answers4

269

You should take a look at pipdeptree:

$ pip install pipdeptree
$ pipdeptree -fl
Warning!!! Cyclic dependencies found:
------------------------------------------------------------------------
xlwt==0.7.5
ruamel.ext.rtf==0.1.1
xlrd==0.9.3
openpyxl==2.0.4
  - jdcal==1.0
pymongo==2.7.1
reportlab==3.1.8
  - Pillow==2.5.1
  - pip
  - setuptools

It doesn't generate a requirements.txt file as you indicated directly. However the source (255 lines of python code) should be relatively easy to modify to your needs, or alternatively you can (as @MERose indicated is in the pipdeptree 0.3 README ) out use:

pipdeptree --freeze  --warn silence | grep -P '^[\w0-9\-=.]+' > requirements.txt

The 0.5 version of pipdeptree also allows JSON output with the --json option, that is more easily machine parseble, at the expense of being less readable.

pareyesv
  • 590
  • 5
  • 11
Anthon
  • 69,918
  • 32
  • 186
  • 246
  • According to https://pypi.python.org/pypi/pipdeptree/0.3, `pipdeptree | grep -P '^\w+'` prints a requirements.txt. – MERose Mar 09 '16 at 08:59
  • @MERose Thanks for pointing that out. I must have still been using version 0.2 when I wrote this. – Anthon Mar 09 '16 at 09:15
  • It is not working for `bokeh` :( This package have specific organization of requirements so pip does not show them, but conda does. – Sklavit Jul 18 '17 at 15:47
  • It can now directly generate a requirements.txt directly using the --freeze flag – Wasi Master Sep 06 '21 at 16:00
  • As of 2022, project is no longer maintained and not compatible with newer pip and py311. – sorin Aug 07 '22 at 19:46
11

Warning: py2 only / abandonware

yolk can display dependencies for packages, provided that they

  • were installed via setuptools
  • came with metadata that includes dependency information

    $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    
sorin
  • 161,544
  • 178
  • 535
  • 806
ali_m
  • 71,714
  • 23
  • 223
  • 298
  • I'm not sure if there can be a full solution - the problem is that dependency information doesn't always exist (for example for packages installed via `distutils`, which does not support package metadata) – ali_m Jun 20 '13 at 14:46
  • 5
    yolk doesn't have py3k support as of the time of writing. – yegle Jan 13 '15 at 22:45
  • Someone already did the port: https://pypi.org/project/yolk3k/ – vokimon Jan 29 '21 at 13:32
7

You can do it by installing pipdeptree package.

Open command prompt in your project folder. If you are using any virtual environment, then switch to that virtual environment.

Install pipdeptree package using pip

pip install pipdeptree
pipdeptree -fl

This package will list all the dependencies of your project.

For more pipdeptree

enter image description here

Codemaker2015
  • 12,190
  • 6
  • 97
  • 81
5

I realize that many years has passed since this question was asked, but it showed up in my searches so I thought I'd share some knowledge.

The pip-tools package contains a tool called pip-compile that seems to also solve the original poster's problem.

pip-compile takes an input file, which can be setup.py, setup.cfg, pyproject.toml, or requirements.in. The input file is what you write by hand and contains the "direct" dependencies. It may not specify exact dependency versions, but may use version ranges (nor no constraints at all). The tool outputs a new rquirements.txt file with all the indirect dependencies added and also pins down the dependencies to exact versions.

If you run the pip-compile tool again after updating the source file, it will add or remove dependencies from the output file if needed. You can also choose to upgrade a specific dependency by adding a flag.

So while pip-compile does not show you the dependency tree itself, it helps you with collecting all the leafs of the dependency tree (which I assume was what the original poster wanted to do in the end).

Read more here: https://github.com/jazzband/pip-tools/

raek
  • 2,126
  • 17
  • 17