Skip to main content

pypispdx

An SCA tool for creating an SPDX SBOM for a https://pypi.org/ package.

Usage

usage: pypispdx [-h] [--json | --rdf | --xml | --yaml | --spdx3] [--debug] package

where “package” is a Python package available on https://pypi.org/

options:
  -h, --help            Shows this help message and exits.
  --debug               Enables debug output, including detailed messages and full tracebacks.
  -v, --version         Shows the program version and exits.
  --json                Output the result in SPDX 2.3 JSON format.
  --rdf                 Output the result in SPDX 2.3 RDF format.
  --xml                 Output the result in SPDX 2.3 XML format.
  --yaml                Output the result in SPDX 2.3 YAML format.
  --spdx3               Output the result in SPDX 3.0.1 JSON-LD format.

It will create an SPDX 2.3 or 3.0.1 SBOM for the latest available release of the package, including all transitive dependencies.

Network access is needed when running the tool, it will access https://pypi.org and https://clearlydefined.io.

By default, the SPDX 2.3 output will be in tag:value format. The other formats, JSON, RDF, XML and YAML are available by using the corresponding command-line option.

In SPDX 2.3, the SBOM filename will be package-version.spdx (plus the corresponding suffix for the other formats), where the package name will be in lower case, with underscores and dots replaced by dash.

In SPDX 3.0, it will be package-version.spdx3.json as recommended.

Running again the command will give a different result if a newer version of the package or its transitive dependencies are available.

Running the command with different versions of Python might give different results as different versions of transitive dependencies might be selected.

Content of the SBOM

The Creator Organization will be taken from the ORGANIZATION environment variable. If not set, it will be “UNKNOWN”.

The DocumentNamespace will be https://pypi.org/spdx/package-version

For each package, the PackageSupplier will be “Organization: https://pypi.org”.

The PackageDownloadLocation will be a “.tar.gz” file if available. If not available, it will be NOASSERTION.

If available, the PackageChecksum will be provided in both SHA256 and MD5.

The PackageLicenseConcluded and PackageLicenseDeclared will be given if available on PyPI or ClearlyDefined. If not, it will be NOASSERTION. See more details below.

The PackageCopyrightText will taken from https://clearlydefined.io if it is present there. If not, it will be NOASSERTION.

The PURL (Package-URL) will be provided:

  • in the ExternalRef field in SPDX 2.3;
  • in the packageUrl property in SPDX 3.0.

Licenses

First, the licenses will be searched in “license_expression” as specified in PEP 639.

If not available, the licenses will be searched in “license”.

If no “license_expression” and no “license”, the file cache will be used.

The content of the file is like:

# package; license; comment (e.g. pull request)
jsonresolver; BSD-2-Clause AND BSD-3-Clause AND JSON
metrics-miscellany; CC-BY-NC-SA-4.0
multidict; Apache-2.0; https://github.com/aio-libs/multidict/pull/1292
py-tlsh; Apache-2.0 OR BSD-3-Clause
rich-click; MIT

If still no license found, we will search in “classifiers”.

The value used in classifiers will be mapped to the corresponding SPDX identifier.

If the classifier is ambiguous, for example:

License :: OSI Approved :: GNU General Public License (GPL)

a LicenseRef- is created with that text.

If the license cannot be found on https://pypi.org and in cache, it will be searched on https://clearlydefined.io.

When the license is specified with a LicenseRef-, the text of the license is retreived from the license file and put in the SBOM.

See for example infinity-grid.

About PURL specification

The name is case insensitive and lowercased.

Underscore “_” is replaced with dash “-”.

Dot “.” is replaced with dash “-”.

Compliance

SPDX 2.3

The SBOM is valid SPDX 2.3.

It is compliant with the OpenChain Telco SBOM Guide.

You can check it with the openchain-telco-sbom-validator.

SPDX 3.0.1

The SBOM is valid SPDX 3.0.1.

You can check it with:

When an SBOM cannot be created

Versions incompatibility

Running pypispdx with Python 3.14

pypispdx google-ads-reports
Creating SPDX SBOM for PyPI package google-ads-reports
ERROR: Ignored the following versions that require a different python version:
 1.0 Requires-Python >=3.9,<3.13;
 1.0.1 Requires-Python >=3.9,<3.13;
 1.1.0 Requires-Python >=3.9,<3.13;
 1.2.0 Requires-Python >=3.9,<3.13;
 1.2.1 Requires-Python >=3.10,<3.13;
 1.2.2 Requires-Python >=3.10,<3.13;
 1.2.3 Requires-Python >=3.10,<3.13;
 1.3.0 Requires-Python >=3.10,<3.13;
 2.0.0 Requires-Python >=3.12,<3.13;
 2.0.1 Requires-Python >=3.12,<3.13;
 2.0.2 Requires-Python >=3.11,<3.14
ERROR: Could not find a version that satisfies the requirement google-ads-reports (from versions: none)
ERROR: No matching distribution found for google-ads-reports
Cannot create SBOM for google-ads-reports

The SBOM cannot be created as google-ads-reports cannot currently be installed with Python 3.14.

History

What is new in version 0.3.2

  • Sanitize copyright obtained by ClearlyDefined by removing ""
  • Longer timeout for ClearlyDefined

What is new in version 0.3.1

  • Simpler URIs (remove "SPDXRef-")
  • In SPDX 2.3, the create message includes the format
  • Update README to indicate that network access is needed when running the tool

What is new in version 0.3.0

  • Add an option to create the SBOM in SPDX 3.0.1
  • This is experimental

What is new in version 0.2.1

  • Control characters are removed from License and Copyright text
  • SPDX license list is 3.28
  • Better handling of ClearlyDefined failure, SBOM is not created
  • Message says that SBOM is created in SPDX 2.3
  • Creating SBOM in JSON, RDF, XML or YAML format will not erase existing SBOM in tag:value format

What is new in version 0.2.0

Metadata

Release files for pypispdx 0.3.2

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

Source distribution (sdist)

Source distribution for pypispdx 0.3.2
File Size Uploaded
pypispdx-0.3.2.tar.gz 20.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pypispdx 0.3.2
File Interpreter ABI Platform
pypispdx-0.3.2-py3-none-any.whl Python 3 none any Details

Total release size: 38.9 kB

Release files / pypispdx-0.3.2.tar.gz

Download URL pypispdx-0.3.2.tar.gz
Size 20.4 kB
Tags Source
SHA-256 checksum
How to use checksums
2721be2f26503f77dbc346da3b24657428b2216caaad589664e9eefcf4a42e1a
BLAKE2b-256 checksum
How to use checksums
6b4c8228860b8f2414ae2a0bad0a1070821b54017ade4d8bd368c3ab347d9dce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / pypispdx-0.3.2-py3-none-any.whl

Download URL pypispdx-0.3.2-py3-none-any.whl
Size 18.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ed9e1dfa851c32acf3ccd765f75d8be01fe164a925c7e41715b559780d236058
BLAKE2b-256 checksum
How to use checksums
81e513720cecf8e010498a5f23c4c65147d252a5c63d14dc9ba88b95715174c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

This release

0.3.2 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

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