Dump the software license list of Python packages installed with pip.
pip-licenses
is a CLI tool for checking the software license of installed Python packages with pip.
Implemented with the idea inspired by composer licenses
command in Composer (a.k.a PHP package management tool).
https://getcomposer.org/doc/03-cli.md#licenses
Install it via PyPI using pip
command.
# Install or Upgrade to newest available version
$ pip install -U pip-licenses
Execute the command with your venv (or virtualenv) environment.
# Install packages in your venv environment
(venv) $ pip install Django pip-licenses
# Check the licenses with your venv environment
(venv) $ pip-licenses
Name Version License
Django 2.0.2 BSD
pytz 2017.3 MIT
By default, this tool finds the license from package Metadata (--from=meta
). However, depending on the type of package, it does not declare a license only in the Classifiers.
(See also): Set license to MIT in setup.py by alisianoi ・ Pull Request #1058 ・ pypa/setuptools, PEP 314#License
For example, even if you check with the pip show
command, the license is displayed as UNKNOWN
.
(venv) $ pip show setuptools
Name: setuptools
Version: 38.5.0
Summary: Easily download, build, install, upgrade, and uninstall Python packages
Home-page: https://github.com/pypa/setuptools
Author: Python Packaging Authority
Author-email: [email protected]
License: UNKNOWN
If you want to refer to the license declared in the Classifiers, use the --from=classifier
option.
(venv) $ pip-licenses --from=classifier --with-system | grep setuptools
setuptools 38.5.0 MIT License
If you want to find a license from whichever, mixed mode (--from=mixed
) is available in pip-licenses
version 1.14.0 or later.
In mixed mode, it first tries to look for licenses in the Classifiers. When not found in the Classifiers, the license declared in Metadata is displayed.
Note: If neither can find license information, please check with the with-authors
and with-urls
options and contact the software author.
- The
m
keyword is prepared as alias ofmeta
. - The
c
keyword is prepared as alias ofclassifier
. - The
mix
keyword is prepared as alias ofmixed
.
from-classifier
option will be deprecated in version 2.0.0. Please migrate to --from
option.
By default, system packages such as pip
and setuptools
are ignored.
If you want to output all including system package, use the --with-system
option.
(venv) $ pip-licenses --with-system
Name Version License
Django 2.0.2 BSD
PTable 0.9.2 BSD (3 clause)
pip 9.0.1 MIT
pip-licenses 1.0.0 MIT License
pytz 2017.3 MIT
setuptools 38.5.0 UNKNOWN
When executed with the --with-authors
option, output with author of the package.
(venv) $ pip-licenses --with-authors
Name Version License Author
Django 2.0.2 BSD Django Software Foundation
pytz 2017.3 MIT Stuart Bishop
For packages without Metadata, the license is output as UNKNOWN
. To get more package information, use the --with-urls
option.
(venv) $ pip-licenses --with-urls
Name Version License URL
Django 2.0.2 BSD https://www.djangoproject.com/
pytz 2017.3 MIT http://pythonhosted.org/pytz
When executed with the --with-description
option, output with short description of the package.
(venv) $ pip-licenses --with-description
Name Version License Description
Django 2.0.2 BSD A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
pytz 2017.3 MIT World timezone definitions, modern and historical
When executed with the --with-license-file
option, output the location of the package's license file on disk and the full contents of that file. Due to the length of these fields, this option is best paired with --format=json
.
When executed with the --ignore-packages
option, ignore the package specified by argument from list output.
(venv) $ pip-licenses --ignore-packages django
Name Version License
pytz 2017.3 MIT
Package names of arguments can be separated by spaces.
(venv) $ pip-licenses --with-system --ignore-packages django pip pip-licenses
Name Version License
PTable 0.9.2 BSD (3 clause)
pytz 2017.3 MIT
setuptools 38.5.0 UNKNOWN
By default, it is ordered by package name.
If you give arguments to the --order
option, you can output in other sorted order.
(venv) $ pip-licenses --order=license
By default, it is output to the plain
format.
When executed with the --format=markdown
option, you can output list in markdown format. The m
md
keyword is prepared as alias of markdown
.
(venv) $ pip-licenses --format=markdown
| Name | Version | License |
|--------|---------|---------|
| Django | 2.0.2 | BSD |
| pytz | 2017.3 | MIT |
When inserted in a markdown document, it is rendered as follows:
Name | Version | License |
---|---|---|
Django | 2.0.2 | BSD |
pytz | 2017.3 | MIT |
When executed with the --format=rst
option, you can output list in "Grid tables" of reStructuredText format. The r
rest
keyword is prepared as alias of rst
.
(venv) $ pip-licenses --format=rst
+--------+---------+---------+
| Name | Version | License |
+--------+---------+---------+
| Django | 2.0.2 | BSD |
+--------+---------+---------+
| pytz | 2017.3 | MIT |
+--------+---------+---------+
When executed with the --format=confluence
option, you can output list in Confluence (or JIRA) Wiki markup format. The c
keyword is prepared as alias of confluence
.
(venv) $ pip-licenses --format=confluence
| Name | Version | License |
| Django | 2.0.2 | BSD |
| pytz | 2017.3 | MIT |
When executed with the --format=html
option, you can output list in HTML table format. The h
keyword is prepared as alias of html
.
(venv) $ pip-licenses --format=html
<table>
<tr>
<th>Name</th>
<th>Version</th>
<th>License</th>
</tr>
<tr>
<td>Django</td>
<td>2.0.2</td>
<td>BSD</td>
</tr>
<tr>
<td>pytz</td>
<td>2017.3</td>
<td>MIT</td>
</tr>
</table>
When executed with the --format=json
option, you can output list in JSON format easily allowing post-processing. The j
keyword is prepared as alias of json
.
[
{
"Author": "Django Software Foundation",
"License": "BSD",
"Name": "Django",
"URL": "https://www.djangoproject.com/",
"Version": "2.0.2"
},
{
"Author": "Stuart Bishop",
"License": "MIT",
"Name": "pytz",
"URL": "http://pythonhosted.org/pytz",
"Version": "2017.3"
}
]
When executed with the --format=csv
option, you can output list in quoted CSV format. Useful when you want to copy/paste the output to an Excel sheet.
(venv) $ pip-licenses --format=csv
"Name","Version","License"
"Django","2.0.2","BSD"
"pytz","2017.3","MIT"
The following options will be deprecated in version 2.0.0. Please migrate to --format
option.
--format-markdown
--format-rst
--format-confluence
--format-html
--format-json
When executed with the --summary
option, you can output a summary of each license.
(venv) $ pip-licenses --summary --from=classifier --with-system
Count License
2 BSD License
4 MIT License
Note: When using this option, only --order=count
or --order=license
has an effect for the --order
option. And using --with-authors
and --with-urls
will be ignored.
Other, please make sure to execute the --help
option.
You can check the package license used by your app in the isolated Docker environment.
# Clone this repository to local
$ git clone https://github.com/raimon49/pip-licenses.git
$ cd pip-licenses
# Create your app's requirements.txt file
# Other ways, pip freeze > docker/requirements.txt
$ echo "Flask" > docker/requirements.txt
# Build docker image
$ docker build . -t myapp-licenses
# Check the package license in container
$ docker run --rm myapp-licenses
Name Version License
Click 7.0 BSD License
Flask 1.0.2 BSD License
Jinja2 2.10 BSD License
MarkupSafe 1.1.1 BSD License
Werkzeug 0.15.2 BSD License
itsdangerous 1.1.0 BSD License
# Check with options
$ docker run --rm myapp-licenses --summary
Count License
4 BSD
2 BSD-3-Clause
# When you need help
$ docker run --rm myapp-licenses --help
Note: This Docker image can not check package licenses with C and C ++ Extensions. It only works with pure Python package dependencies.
If you want to resolve build environment issues, try adding build-base
packages and more.
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,6 +7,8 @@ WORKDIR ${APPDIR}
COPY ./docker/requirements.txt ${APPDIR}
+RUN set -ex && apk add --no-cache --update --virtual .py-deps \
+ build-base
RUN python3 -m venv ${APPDIR}/myapp \
&& source ${APPDIR}/myapp/bin/activate
- PTable by Luke Maurits and maintainer of fork version Kane Blueriver under the BSD-3-Clause License
pip-licenses
has been implemented in the policy to minimize the dependence on external package.
Uninstall package and dependent package with pip
command.
$ pip uninstall pip-licenses PTable