请注意,即将发布的 0.8 版本为迎接即将到来的 SPDX v3.0 版本进行了重大重构,导致 API 出现破坏性变更。 请参考 迁移指南 来更新您现有的代码。
v0.8 的主要特性包括:
请注意,v0.8 仅支持写入,不支持读取 SPDX 3.0 文档。 详情请参见 #760。
该库以 Python 实现了 SPDX 解析器、转换器、验证器和处理器。
有关此库的重要更新会通过 SPDX 技术邮件列表分享:https://lists.spdx.org/g/Spdx-tech。
AGraph 来可视化 SPDX 文档的结构。
注意:这是一个可选特性,需要额外安装可选依赖项请参阅下面的 SPDX 3.0 快速入门。 该实现基于仓库 https://github.com/spdx/spdx-3-model 中的描述性 Markdown 文件 (提交:a5372a3c145dbdfc1381fc1f791c68889aafc7ff)。 最新的 SPDX 3.0 模型可在 https://spdx.github.io/spdx-spec/v3.0/serializations/ 获取。
和往常一样,您应该在虚拟环境(venv)中工作。您可以使用 yourenv/bin/pip install . 安装本仓库的本地克隆,也可以从 PyPI 安装
(请查看 最新版本,并像这样安装:
yourenv/bin/pip install spdx-tools==0.8.3)。请注意,在 Windows 上应为 Scripts 而不是 bin。
解析/验证(用于解析任何格式):
使用 pyspdxtools -i <文件名>,其中 <文件名> 是文件的位置。输入格式会根据文件扩展名自动推断。
如果您使用的是源代码发行版,请尝试运行:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json
转换(用于将一种格式转换为另一种格式):
使用 pyspdxtools -i <输入文件> -o <输出文件>,其中 <输入文件> 是要转换的文件位置,
而 <输出文件> 是输出文件的位置。输入和输出格式会根据文件扩展名自动推断。
如果您使用的是源代码发行版,请尝试运行:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag
如果您想跳过验证过程,请提供 --novalidation 标志,如下所示:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag --novalidation
(请谨慎使用:注意未检测到的无效文档可能导致工具出现意外行为)
如需帮助,请使用 pyspdxtools --help
数据模型
spdx_tools.spdx.model 包构成了内部 SPDX v2.3 数据模型(v2.2 只是它的一个子集)。所有与 SPDX 文档创建相关的类都在 此处 的 __init__.py 中导出。@dataclass_with_properties 实现,这是 @dataclass 的自定义扩展。ConstructorTypeError 或 TypeError)。这使得尽早捕获无效属性并仅构造有效文档变得容易。list.append(item) 会绕过类型检查(当再次读取 list 时仍会引发 TypeError)。我们建议改用 list = list + [item]。Document 类,它链接到所有其他类。以下是一些可能用例的示例,可帮助您快速上手 spdx-tools。 如果您想要更多示例,例如如何从头创建 SPDX 文档,请查看示例文件夹。
import logging
from license_expression import get_spdx_licensing
from spdx_tools.spdx.model import (Checksum, ChecksumAlgorithm, File,
FileType, Relationship, RelationshipType)
from spdx_tools.spdx.parser.parse_anything import parse_file
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
from spdx_tools.spdx.writer.write_anything import write_file
# read in an SPDX document from a file
document = parse_file("spdx_document.json")
# change the document's name
document.creation_info.name = "new document name"
# define a file and a DESCRIBES relationship between the file and the document
checksum = Checksum(ChecksumAlgorithm.SHA1, "71c4025dd9897b364f3ebbb42c484ff43d00791c")
file = File(name="./fileName.py", spdx_id="SPDXRef-File", checksums=[checksum],
file_types=[FileType.TEXT],
license_concluded=get_spdx_licensing().parse("MIT and GPL-2.0"),
license_comment="licenseComment", copyright_text="copyrightText")
relationship = Relationship("SPDXRef-DOCUMENT", RelationshipType.DESCRIBES, "SPDXRef-File")
# add the file and the relationship to the document
# (note that we do not use "document.files.append(file)" as that would circumvent the type checking)
document.files = document.files + [file]
document.relationships = document.relationships + [relationship]
# validate the edited document and log the validation messages
# (depending on your use case, you might also want to utilize the validation_message.context)
validation_messages = validate_full_spdx_document(document)
for validation_message in validation_messages:
logging.warning(validation_message.validation_message)
# if there are no validation messages, the document is valid
# and we can safely serialize it without validating again
if not validation_messages:
write_file(document, "new_spdx_document.rdf", validate=False)
与 SPDX v2 不同,现在所有元素都是中央 Element 类的子类。
这包括软件包、文件、片段、关系、注释,也包括 SBOM、SpdxDocument 等。
为了序列化,所有要序列化到同一文件中的元素都被收集到一个 Payload 中。
这只是一个字典,将每个元素的 SpdxId 映射到其自身。
使用 write_payload() 函数来序列化有效载荷。
目前有两种选择:
spdx_tools.spdx3.writer.json_ld.json_ld_writer 模块会生成该有效载荷的 JSON-LD 文件。spdx_tools.spdx3.writer.console.payload_writer 模块会向控制台输出调试信息。请注意,这不是 SPDX 规范的一部分,一旦有更好的标准出现,它可能会被移除。您可以通过 spdx_tools.spdx3.bump_from_spdx2.spdx_document 模块将 SPDX v2 文档转换为 v3。
bump_spdx_document() 函数将返回一个有效载荷,其中包含一个 SpdxDocument 元素,以及 v2 文档中包含的每个软件包、文件、片段、关系或注释所对应的一个元素。
非常欢迎贡献!请参阅 CONTRIBUTING.md 了解如何向代码库做出贡献的说明。
这是 @ah450(或 https://github.com/a-h-i)最初 GSoC 贡献的成果,并由一个由 SPDX 采用者和爱好者组成的社区维护。 为了准备 SPDX v3.0 的发布,该仓库在 2022 年 11 月至 2023 年 7 月期间进行了重大重构。
图形生成(可选特性)
此特性会根据提供的关系统生成一个图形,表示 SPDX 文档中的所有元素及其连接。该图形可以渲染为图片。以下是文件 tests/spdx/data/SPDXJSONExample-v2.3.spdx.json 的示例:

请确保您安装了可选依赖项 networkx 和 pygraphviz。为此,请运行 pip install ".[graph_generation]"。
使用 pyspdxtools -i <输入文件> --graph -o <输出文件>,其中 <输出文件> 是一个文件名,格式需对 pygraphviz 有效(请参阅
文档 此处)。
如果您使用的是源代码发行版,请尝试运行
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json --graph -o SPDXJSONExample-v2.3.spdx.png 来生成
一个 PNG 文件,其中包含示例文件结构的概览。
documentDescribes 和 hasFiles 的说明:这些字段将在内部数据模型中转换为关系。由于它们已被弃用,这些字段将不会写入输出中。解析
parse_anything.py 模块中的 parse_file(file_name) 来解析具有受支持文件扩展名的任意文件。Document 实例。解析失败将引发 SPDXParsingError,其中包含所有遇到问题的列表。验证
validate_full_spdx_document(document) 来验证 Document 类的实例。ValidationMessage 对象列表,每个对象由描述无效性的字符串和用于定位验证错误来源的 ValidationContext 组成。SPDX-2.2 和 SPDX-2.3 版本。写入
write_anything.py 模块中的 write_file(document, file_name) 将 Document 实例写入指定文件。
序列化格式根据文件扩展名确定。write_file(document, file_name, validate=False) 跳过验证。
注意:只有有效的文档才能被可靠地序列化;不支持对无效文档进行序列化。