guettli
guettli

Reputation: 27806

show reverse dependencies with pip?

Is it possible to show the reverse dependencies with pip?

I want to know which package needs package foo. And which version of foo is needed by this package.

Upvotes: 30

Views: 6067

Answers (4)

x-yuri
x-yuri

Reputation: 18833

One can use the pipdeptree package. To list reverse dependencies of an installed cffi package:

$ pipdeptree -p cffi -r
cffi==1.14.0
  - cryptography==2.9 [requires: cffi>=1.8,!=1.11.3]
    - social-auth-core==3.3.3 [requires: cryptography>=1.4]
      - python-social-auth==0.3.6 [requires: social-auth-core]
      - social-auth-app-django==2.1.0 [requires: social-auth-core>=1.2.0]

Upvotes: 9

9769953
9769953

Reputation: 12192

To update the answer to current (2019), when pip.get_installed_distributions() does not exist anymore, use pkg_resources (as mentioned in a comments):

import pkg_resources
import sys

def find_reverse_deps(package_name):
    return [
        pkg.project_name for pkg in pkg_resources.WorkingSet()
        if package_name in {req.project_name for req in pkg.requires()}
    ]

if __name__ == '__main__':
    print(find_reverse_deps(sys.argv[1]))

Upvotes: 20

Alexander Zhukov
Alexander Zhukov

Reputation: 4547

This is possible for already installed packages using pip's python API. There is the pip.get_installed_distributions function, which can give you a list of all third party packages currently installed.

# rev_deps.py
import pip
import sys

def find_reverse_deps(package_name):
    return [
        pkg.project_name for pkg in pip.get_installed_distributions()
        if package_name in {req.project_name for req in pkg.requires()}
    ]

if __name__ == '__main__':
    print find_reverse_deps(sys.argv[1])

This script will output the list of packages, that require a specified one:

$python rev_deps.py requests

Upvotes: 10

Wernight
Wernight

Reputation: 37600

I found Alexander's answer perfect, except it's hard to copy/paste. Here is the same, ready to paste:

import pip
def rdeps(package_name):
    return [pkg.project_name
            for pkg in pip.get_installed_distributions()
            if package_name in [requirement.project_name
                                for requirement in pkg.requires()]]

rdeps('some-package-name')

Upvotes: 14

Related Questions