How can I see all packages that depend on a certain package with PIP?

Each Answer to this Q is separated by one/two green lines.

I would like to see a list of packages that depend on a certain package with PIP. That is, given django, I would like to see django-cms, django-filer, because I have these packages installed and they all have django as dependency.

Update (2021):

Since pip version 10 you can do:

pkg=httplib2
pip show $pkg | grep ^Required-by

or for bash

pkg=httplib2
grep ^Required-by <(pip show $pkg)

so you could create an alias like:

alias pyreq='pip show $pkg | grep ^Required-by'

and querying by:

pkg=httplib2 pyreq

which should give (for ubuntu):

Required-by: lazr.restfulclient, launchpadlib

Original:

Quite straightforward:

pip show <insert_package_name_here>| grep ^Requires

Or the other way around: (sorry i got it wrong!)

for NAME in $(pip freeze | cut -d= -f1); do REQ=$(pip show $NAME| grep Requires); if [[ "$REQ" =~ "$REQUIRES" ]]; then echo $REQ;echo "Package: $NAME"; echo "---" ; fi;  done

before that set your search-string with:

REQUIRES=django

essentially you have to go through the whole list and query for every single one. That may take some time.


Edit:
Also it does only work on installed packages, I don’t see pip providing dependencies on not installed packages.

I know there’s already an accepted answer here, but really, it seems to me that what you want is to use pipdeptree:

pip install pipdeptree
pipdeptree --help

pipdeptree -r -p django

Since version 10, pip show also includes a “Required-by” entry. So just

pip show <package_name>

is enough nowadays. Or possibly

pip show <package_name> | grep ^Required-by

if you want to get just that single line for a script or whatever.

This one, for pip older than 1.3.1 will list all packages and it’s dependencies, you can parse its output with any scripting language, for Requires ... django inclusions:

pip freeze | cut -f 1 -d'=' |  xargs -L1 pip show 

For example, following snippet:

import os
import re

package="numpy"
regex = re.compile('.*{}($|,).*'.format(package))

def chunks(l, n): return [l[i:i+n] for i in range(0, len(l), n)]

cmd = "pip freeze | cut -f 1 -d'=' |  xargs -L1 pip show"
packages = os.popen(cmd).read()
pkg_infos = chunks(packages.splitlines(), 5)
print '\n'.join(x[1][6:] for x in filter(lambda x: regex.match(x[-1]), pkg_infos))

outputs pandas on my system.

One liner based on requirements.txt. In this example I’m looking for funcsigs reverse dependency, and found mock. Just change funcsigs by something else.

cat requirements.txt | grep -v git | sed 's/==.*//' | xargs -I % echo 'pip show % 2>/dev/null | grep Requires | grep -q funcsigs && echo %' | sh


The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .