41

多数の依存関係を持つ Python プロジェクトを監査しようとしています。各プロジェクトのホームページ/ライセンス条項を手動で調べることはできますが、ほとんどの OSS パッケージにはメタデータにライセンス名とバージョンが既に含まれているようです。

残念ながら、pip または easy_install には、パッケージ名とインストールされているバージョン以外を一覧表示するオプションが見つかりません (pip のフリーズを使用)。

Python パッケージのライセンス メタデータを一覧表示するツールへのポインタを持っている人はいますか?

4

11 に答える 11

28

使用できます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

使用例:

>>> get_pkg_license('mercurial')
'GNU GPLv2+'
>>> get_pkg_license('pytz')
'MIT'
>>> get_pkg_license('django')
'UNKNOWN'
于 2013-09-30T03:57:46.387 に答える
3

jupyter を実行している方向けのわずかに優れたバージョン - Anaconda のデフォルトを使用 - インストール不要

import pkg_resources
import pandas as pd

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():
    table = []
    for pkg in sorted(pkg_resources.working_set, key=lambda x: str(x).lower()):
        table.append([str(pkg).split(' ',1)[0], str(pkg).split(' ',1)[1], get_pkg_license(pkg)])
    df = pd.DataFrame(table, columns=['Package',  'Version', 'License'])
    return df

print_packages_and_licenses()   
于 2019-03-13T21:06:41.580 に答える