python - que - instalar pip en windows
¿Puede pip(o setuptools, distribuir, etc.) enumerar la licencia utilizada por cada paquete instalado? (9)
Estoy intentando auditar un proyecto de Python con una gran cantidad de dependencias y aunque puedo buscar manualmente los términos de la página de inicio / licencia de cada proyecto, parece que la mayoría de los paquetes OSS ya deberían contener el nombre de la licencia y la versión en sus metadatos.
Desafortunadamente, no puedo encontrar ninguna opción en pip o easy_install para listar más que el nombre del paquete y la versión instalada (a través de pip freeze).
¿Alguien tiene punteros a una herramienta para listar los metadatos de licencia para los paquetes de Python?
1. Elección
pip-licenses paquete PyPI.
2. Relevancia
Esta respuesta es relevante para marzo de 2018. En el futuro, los datos de esta respuesta pueden estar obsoletos.
3. Argumentación
- simplemente instalación -
pip install pip-licenses
, - Más características y opciones, que yolk3k ,
- activo mantenido.
4. Demostración
Ejemplo de salida:
D:/KristinitaPelican>pipenv run pip-licenses --with-system --order=license --format-markdown
| Name | Version | License |
|---------------------|-----------|--------------------------------------------------------------|
| requests | 2.18.4 | Apache 2.0 |
| actdiag | 0.5.4 | Apache License 2.0 |
| blockdiag | 1.5.3 | Apache License 2.0 |
| nwdiag | 1.0.4 | Apache License 2.0 |
| seqdiag | 0.9.5 | Apache License 2.0 |
| Jinja2 | 2.10 | BSD |
| MarkupSafe | 1.0 | BSD |
| license-info | 0.8.7 | BSD |
| pip-review | 1.0 | BSD |
| pylicense | 1 | BSD |
| PTable | 0.9.2 | BSD (3 clause) |
| webcolors | 1.8.1 | BSD 3-Clause |
| Markdown | 2.6.11 | BSD License |
| Pygments | 2.2.0 | BSD License |
| yolk3k | 0.9 | BSD License |
| packaging | 17.1 | BSD or Apache License, Version 2.0 |
| idna | 2.6 | BSD-like |
| markdown-newtab | 0.2.0 | CC0 |
| pyembed | 1.3.3 | Copyright © 2013 Matt Thomson |
| pyembed-markdown | 1.1.0 | Copyright © 2013 Matt Thomson |
| python-dateutil | 2.7.2 | Dual License |
| Unidecode | 1.0.22 | GPL |
| chardet | 3.0.4 | LGPL |
| beautifulsoup4 | 4.6.0 | MIT |
| funcparserlib | 0.3.6 | MIT |
| gevent | 1.2.2 | MIT |
| markdown-blockdiag | 0.7.0 | MIT |
| pip | 9.0.1 | MIT |
| pkgtools | 0.7.3 | MIT |
| pytz | 2018.3 | MIT |
| six | 1.11.0 | MIT |
| urllib3 | 1.22 | MIT |
| wheel | 0.30.0 | MIT |
| blinker | 1.4 | MIT License |
| greenlet | 0.4.13 | MIT License |
| pip-licenses | 1.7.0 | MIT License |
| pymdown-extensions | 4.9.2 | MIT License |
| pyparsing | 2.2.0 | MIT License |
| certifi | 2018.1.18 | MPL-2.0 |
| markdown-downheader | 1.1.0 | Simplified BSD License |
| Pillow | 5.0.0 | Standard PIL License |
| feedgenerator | 1.9 | UNKNOWN |
| license-lister | 0.1.1 | UNKNOWN |
| md-environ | 0.1.0 | UNKNOWN |
| mdx-cite | 1.0 | UNKNOWN |
| mdx-customspanclass | 1.1.1 | UNKNOWN |
| pelican | 3.7.1 | UNKNOWN |
| setuptools | 38.5.1 | UNKNOWN |
| docutils | 0.14 | public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) |
5. Enlace externo
Aquí hay un fragmento de copia que se puede pegar y que imprimirá sus paquetes.
Requiere: prettytable ( pip install prettytable
)
Código
import pkg_resources
import prettytable
def 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()
Ejemplo de salida
+---------------------------+--------------------------------------------------------------+
| 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 |
+---------------------------+--------------------------------------------------------------+
Aquí hay una manera de hacer esto con yolk3k (herramienta de línea de comandos para consultar los paquetes PyPI y Python instalados en su sistema).
pip install yolk3k
yolk -l -f license
#-l lists all installed packages
#-f Show specific metadata fields (In this case, License)
Basado en la respuesta proporcionada por @garromark y modificada para Python 3, uso esto en la línea de comandos:
import pkg_resources import copy
def get_packages_info():
KEY_MAP = {
"Name": ''name'',
"Version": ''version'',
"License": ''license'',
}
empty_info = {}
for key, name in KEY_MAP.items():
empty_info[name] = ""
packages = pkg_resources.working_set.by_key
infos = []
for pkg_name, pkg in packages.items():
info = copy.deepcopy(empty_info)
try:
lines = pkg.get_metadata_lines(''METADATA'')
except (KeyError, IOError):
lines = pkg.get_metadata_lines(''PKG-INFO'')
for line in lines:
try:
key, value = line.split('': '', 1)
if key in KEY_MAP:
info[KEY_MAP[key]] = value
except ValueError:
pass
infos += [info]
return "name,version,license/n%s" % "/n".join([''"%s","%s","%s"'' % (info[''name''], info[''version''], info[''license'']) for info in sorted(infos, key=(lambda item: item[''name''].lower()))])
print(get_packages_info())
Con pip
pip show django | grep License
Si desea obtener el clasificador PyPI para la licencia, use la opción detallada:
pip show -v django | grep ''License ::''
Encontré varias ideas de las respuestas y comentarios para esta pregunta que eran relevantes y escribí un breve guión para generar la información de licencia para el virtualenv aplicable:
import pkg_resources
import copy
def get_packages_info():
KEY_MAP = {
"Name": ''name'',
"Version": ''version'',
"License": ''license'',
}
empty_info = {}
for key, name in KEY_MAP.iteritems():
empty_info[name] = ""
packages = pkg_resources.working_set.by_key
infos = []
for pkg_name, pkg in packages.iteritems():
info = copy.deepcopy(empty_info)
try:
lines = pkg.get_metadata_lines(''METADATA'')
except (KeyError, IOError):
lines = pkg.get_metadata_lines(''PKG-INFO'')
for line in lines:
try:
key, value = line.split('': '', 1)
if KEY_MAP.has_key(key):
info[KEY_MAP[key]] = value
except ValueError:
pass
infos += [info]
return "name,version,license/n%s" % "/n".join([''"%s","%s","%s"'' % (info[''name''], info[''version''], info[''license'']) for info in sorted(infos, key=(lambda item: item[''name''].lower()))])
La respuesta no funcionó para mí, muchas de esas bibliotecas generaron excepciones.
Así lo hizo un poco la fuerza bruta.
def get_pkg_license_use_show(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.
"""
out = subprocess.check_output(["pip", ''show'', pkgname])
pattern = re.compile(r"License: (.*)")
license_line = [i for i in out.split("/n") if i.startswith(''License'')]
match = pattern.match(license_line[0])
license = match.group(1)
return license
Otra opción es usar el verificador de licencias del paquete Python de Brian Dailey.
git clone https://github.com/briandailey/python-packages-license-check.git
cd python-packages-license-check
... activate your chosen virtualenv ...
./check.py
Puedes usar pkg_resources
:
import pkg_resources
def 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
Ejemplo de uso:
>>> get_pkg_license(''mercurial'')
''GNU GPLv2+''
>>> get_pkg_license(''pytz'')
''MIT''
>>> get_pkg_license(''django'')
''UNKNOWN''