Can pip (or setuptools, distribute etc...) list the license used by each installed package?
You can use pkg_resources
:
import pkg_resourcesdef get_pkg_license(pkgname): """ Given a package reference (as from requirements.txt), return license listed in package metadata. NOTE: This function does no error checking and is for demonstration purposes only. """ pkgs = pkg_resources.require(pkgname) pkg = pkgs[0] for line in pkg.get_metadata_lines('PKG-INFO'): (k, v) = line.split(': ', 1) if k == "License": return v return None
Example use:
>>> get_pkg_license('mercurial')'GNU GPLv2+'>>> get_pkg_license('pytz')'MIT'>>> get_pkg_license('django')'UNKNOWN'
Here is a copy-pasteable snippet which will print your packages.
Requires: prettytable (pip install prettytable
)
Code
import pkg_resourcesimport prettytabledef get_pkg_license(pkg): try: lines = pkg.get_metadata_lines('METADATA') except: lines = pkg.get_metadata_lines('PKG-INFO') for line in lines: if line.startswith('License:'): return line[9:] return '(Licence not found)'def print_packages_and_licenses(): t = prettytable.PrettyTable(['Package', 'License']) for pkg in sorted(pkg_resources.working_set, key=lambda x: str(x).lower()): t.add_row((str(pkg), get_pkg_license(pkg))) print(t)if __name__ == "__main__": print_packages_and_licenses()
Example Output
+---------------------------+--------------------------------------------------------------+| Package | License |+---------------------------+--------------------------------------------------------------+| appdirs 1.4.3 | MIT || argon2-cffi 16.3.0 | MIT || boto3 1.4.4 | Apache License 2.0 || botocore 1.5.21 | Apache License 2.0 || cffi 1.10.0 | MIT || colorama 0.3.9 | BSD || decorator 4.0.11 | new BSD License || Django 1.11 | BSD || django-debug-toolbar 1.7 | BSD || django-environ 0.4.3 | MIT License || django-storages 1.5.2 | BSD || django-uuslug 1.1.8 | BSD || djangorestframework 3.6.2 | BSD || docutils 0.13.1 | public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) || EasyProcess 0.2.3 | BSD || ipython 6.0.0 | BSD || ipython-genutils 0.2.0 | BSD || jedi 0.10.2 | MIT || jmespath 0.9.1 | MIT || packaging 16.8 | BSD or Apache License, Version 2.0 || pickleshare 0.7.4 | MIT || pip 9.0.1 | MIT || prettytable 0.7.2 | BSD (3 clause) || prompt-toolkit 1.0.14 | UNKNOWN || psycopg2 2.6.2 | LGPL with exceptions or ZPL || pycparser 2.17 | BSD || Pygments 2.2.0 | BSD License || pyparsing 2.2.0 | MIT License || python-dateutil 2.6.0 | Simplified BSD || python-slugify 1.2.4 | MIT || pytz 2017.2 | MIT || PyVirtualDisplay 0.2.1 | BSD || s3transfer 0.1.10 | Apache License 2.0 || selenium 3.0.2 | UNKNOWN || setuptools 35.0.2 | UNKNOWN || simplegeneric 0.8.1 | ZPL 2.1 || six 1.10.0 | MIT || sqlparse 0.2.3 | BSD || traitlets 4.3.2 | BSD || Unidecode 0.4.20 | GPL || wcwidth 0.1.7 | MIT || wheel 0.30.0a0 | MIT || win-unicode-console 0.5 | MIT |+---------------------------+--------------------------------------------------------------+
Here is a way to do this with yolk3k (Command-line tool for querying PyPI and Python packages installed on your system.)
pip install yolk3kyolk -l -f license#-l lists all installed packages#-f Show specific metadata fields (In this case, License)