Skip to main content

Python licenser

The Python licenser is aimed at distilling down the appropriate license for one or many pip "requirements" files into a single file.

How do I install it?

$ pip install python-licenser

How do I use it?

$ python3 -m python_licenser -h

How does it work?

With no arguments (other than a pip "requirements" file and a Python executable path that has those requirements installed), the process is as follows:

  • walk the given Python executable's site-packages folder and build up package metadata (and license files, if present)
  • filter down by packages that are listed in the pip "requirements" file (and those packages dependencies, and their dependencies, and their dependencies... you get the gist)
    • note: it follows "-r some_file.txt" references found in the pip "requirements" files
  • if a license name could not be secured for a package, try to gather that from the package's PyPI web page
    • if a license name has still not been secured and the package lists a GitHub home page, try to find a license from there
      • otherwise, assume the package to be commercially licensed (as it is legally understood that is the case)
  • if a license file could not be secured for a package and the package lists a GitHub home page, try to find a license from there
    • otherwise, create a license (for the known license name) from a local collection of licenses (within the Python Third Party License Generator)
  • show a summary of packages against licenses to the user
  • build a THIRDPARTYLICENSES file in the current folder
  • give a return code of zero for success or non-zero for failures (e.g. GPL-licensed packages detected when specified to not permit GPL)

It's worth noting that information learned about packages is cached- so if you have to build one third party licenses file for a large project that has many components with many dependencies (but some overlap) then it's best to specify all those pip "requirements" files and Python executable paths in a single call to the Python third_party_license_file_generator as it will take less time overall.

You can specify a number of command line options (check syntax with -h) to do things like the following:

  • handle multiple pip "requirements" files
  • handle multiple Python executable paths
  • whether or not to permit GPL-licensed packages (default no)
  • specific GPL-licensed package exceptions (e.g. if a package lists exceptions to the GPL that may suit your needs but is still GPL-licensed)
  • whether or not to permit comercially-licensed packages (default no)
  • specific comercially-licensed package exceptions (e.g. if you have a license for a package or if you own a package)
  • a "skip prefix" (e.g. if you want to skip all packages starting with a certain string)
  • disable internet lookups (if you don't want to pull data from PyPI and GitHub)

Examples

Two different pip "requirements" files, two different Python paths (Virtualenvs) and a skip prefix:

python -m third_party_license_file_generator \
    -r requirements-py.txt \
    -p ~/.virtualenvs/backend_py/bin/python \
    -r requirements-pypy.txt \
    -p ~/.virtualenvs/backend_pypy/bin/python \
    -s ims-

Please note that pip "requirements" files and Python executable paths are paired together in the order they're specified.

Three different pip "requirements" files, two different Python paths (need to repeat), a GPL exception and a custom output file:

python -m third_party_license_file_generator \
    -r requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r pypy_requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r cpython_requirements.txt \
    -p ~/.virtualenvs/api_py/bin/python \
    -x uWSGI \ 
    -o ThirdPartyLicenses.txt

Three different pip "requirements" files, two different Python paths (need to repeat), a GPL exception, a custom output file and a license override file:

# contents of license_override_file.yml
uWSGI: 
    license_name: GPL-2.0 w/ linking exception
    license_file: https://raw.githubusercontent.com/unbit/uwsgi/master/LICENSE

python -m third_party_license_file_generator \
    -r requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r pypy_requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r cpython_requirements.txt \
    -p ~/.virtualenvs/api_py/bin/python \
    -x uWSGI \ 
    -o ThirdPartyLicenses.txt \
    -l license_override_file.yml

An example of the structure of the generated third party license file is as follows:

Start of 'ThirdPartyLicenses.txt' generated by Python third_party_license_generator at 2018-04-19 12:36:58.627421

----------------------------------------

Package: Django
License: BSD-3-clause
Requires: pytz
Author: Django Software Foundation <foundation@djangoproject.com>
Home page: https://www.djangoproject.com/

(license content appears here in full)

----------------------------------------

End of 'ThirdPartyLicenses.txt' generated by Python third_party_license_generator at 2018-04-19 12:36:58.627825

Release files for python-licenser 2020.7.29

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for python-licenser 2020.7.29
File Size Uploaded
python-licenser-2020.7.29.tar.gz 57.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for python-licenser 2020.7.29
File Interpreter ABI Platform
python_licenser-2020.7.29-py3-none-any.whl Python 3 none any Details

Total release size: 133.7 kB

Release files / python-licenser-2020.7.29.tar.gz

Download URL python-licenser-2020.7.29.tar.gz
Size 57.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4a7ea14e15240fc1304cf5a2299bb8e41b52673d0354d5b58e81bf7d9b67f361
BLAKE2b-256 checksum
How to use checksums
b13a1016183dbdc2d520b7f96c92911a4041474506f565216096e560e1b89210
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5

Release files / python_licenser-2020.7.29-py3-none-any.whl

Download URL python_licenser-2020.7.29-py3-none-any.whl
Size 76.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e52efb03a8249e6f90b80b01b9654adf4361dc87c722e6a7e54c69b4bb278e73
BLAKE2b-256 checksum
How to use checksums
efed234b9efb711460bfc07ef3c3f42bb085919fd29c85c20e2302075c4d99b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5

Release history Release notifications | RSS feed

This release

2020.7.29 This release

2 release files

2020.7

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page