Skip to main content

PyPI version

Pygfried

pygfried is a CPython extension that brings siegfried - a powerful, signature-based file format identification tool written in Go - into the Python ecosystem.

Identifying a file with pygfried

Instead of reimplementing siegfried's logic, pygfried embeds the original Go code directly, making core siegfried functionality available to Python users without any changes to the underlying detection engine.

No animals were harmed in the making of this extension.

Python support

Pygfried supports standard CPython 3.11 through 3.15. Its wheels use Python's stable ABI, so the same platform wheel works across these interpreter versions. Free-threaded CPython builds are not currently supported.

macOS wheels require macOS 13 (Ventura) or later.

Usage

$ pip install pygfried
$ python -q
>>> import pygfried
>>> pygfried.version()
'1.11.9'
>>> pygfried.identify("example.png")
'fmt/13'
>>> pygfried.identify("example.png", detailed=True)
{'siegfried': '1.11.9', 'scandate': '2026-09-30T17:35:59+02:00', 'signature': 'default.sig', 'created': '2026-09-27T12:04:02+10:00', 'identifiers': [{'name': 'pronom', 'details': 'DROID_SignatureFile_V125.xml; container-signature-20260119.xml'}], 'files': [{'filename': 'example.png', 'filesize': 676214, 'modified': '2025-06-13T11:53:28+02:00', 'errors': '', 'matches': [{'ns': 'pronom', 'id': 'fmt/13', 'format': 'Portable Network Graphics', 'version': '1.2', 'mime': 'image/png', 'class': 'Image (Raster)', 'basis': 'extension match png; byte match at [[0 16] [2962 4] [676202 12]]', 'warning': ''}]}]}
>>> pygfried.identify_many(["example.png", "README.md"], workers=2)
{'siegfried': '1.11.9', ...}
>>> pygfried.identify_dir("samples", recursive=True, workers=2)
{'siegfried': '1.11.9', ...}

When identifying an empty file, identify(path) raises pygfried.EmptySourceError, a subclass of pygfried.GoError and OSError. This also applies to Scanner.identify(path). Existing handlers for GoError continue to catch this exception.

With detailed=True, or when using identify_many or identify_dir, empty files are reported in the results with errors: "empty source" and any extension-based matches. Other files in the scan are still identified.

Custom scanners

The module-level functions use Siegfried's embedded default.sig. To select another complete Siegfried signature database, create a Scanner with its path:

import pygfried

scanner = pygfried.Scanner(signature="/usr/share/siegfried/custom.sig")
scanner.identify("example.png")
scanner.identify_many(["example.png", "README.md"], workers=2)
scanner.identify_dir("samples", recursive=True, workers=2)

External databases are validated and loaded into memory when the scanner is constructed, so changing or deleting the file afterward does not affect that scanner.

As a convenience, a scanner can instead select a bundled signature profile by name:

scanner = pygfried.Scanner(profile="archivematica")
scanner.identify("disk-image.ad1")
# 'archivematica-fmt/2'

Available bundled profiles are:

  • default, which is also selected by Scanner() and matches the behavior of the module-level functions.
  • archivematica, which contains the complete PRONOM database plus Archivematica's extended identifiers for AD1, encrypted AD1, raw disk images, and AFF.

The Archivematica database is copied from the exact Siegfried module version used to compile pygfried. It is embedded in the extension, so it does not need to be installed separately.

profile and signature are keyword-only and mutually exclusive. The read-only scanner.profile property reports the bundled profile, or None for an external database. The read-only scanner.signature property reports the database's filename without its directory path.

Batch and directory scans

Use identify_many when you already have a list of paths, or identify_dir when you want pygfried to scan a directory for you. Both functions return the same detailed result shape as identify(..., detailed=True).

>>> from pathlib import Path
>>> paths = [str(path) for path in Path("samples").rglob("*.png")]
>>> pygfried.identify_many(paths, workers=4)
{'siegfried': '1.11.9', ...}
>>> pygfried.identify_dir("samples", recursive=True, workers=4)
{'siegfried': '1.11.9', ...}

Batch and directory scans avoid repeated Python-to-Go calls. The workers argument controls Go-side concurrency and defaults to 1. Higher values allow multiple files to be identified in parallel. To tune performance, start with the number of CPU cores available to your process, then measure with your own files.

By default identify_dir skips symlinks. Use follow_symlinks=True to identify file symlinks and descend symlinked directories; directory cycles are skipped, and repeated links to the same directory are scanned once.

Concurrency

Both the module-level functions and Scanner methods are safe to call from multiple threads. The module-level API shares one immutable default scanner; each custom scanner owns an independent, immutable Siegfried engine.

The extension holds Python's GIL during identification, so Python threads do not run scans in parallel. Use workers for parallel file identification within a batch.

Each identify_many or identify_dir call controls its own Go-side concurrency with workers, whether it is called on the module or on a scanner. There is no process-wide worker limit beyond the per-call range of 1 to 1024.

For process-based parallelism, use the spawn start method explicitly (multiprocessing.get_context("spawn")). Import pygfried and create any custom scanners inside each worker process. Do not pass scanner instances between processes. Other start methods have not been verified.

Limitations

Go libraries can clash

This project uses Go's -buildmode=c-shared to provide its Python extension. Loading multiple Go-based shared libraries in the same process has known issues and may result in panics or crashes due to conflicts between separate Go runtimes.

This limitation should only affect you if you're using pygfried together with another Python library that also uses a Go extension (built with the same c-shared mechanism) in the same process. If you're just using pygfried on its own, you don't need to worry - everything should work as expected.

Credits

pygfried is powered by the original siegfried project, which is distributed under the Apache License, Version 2.0. All core file format identification logic and signatures are provided by siegfried. We gratefully acknowledge the work of the siegfried project and its contributors.

Metadata

Release files for pygfried 0.21.0

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

Source distribution (sdist)

Source distribution for pygfried 0.21.0
File Size Uploaded
pygfried-0.21.0.tar.gz 907.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for pygfried 0.21.0
File
pygfried-0.21.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
pygfried-0.21.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl CPython 3.11 abi3 Linux glibc 2.17+ ARM64 Details
pygfried-0.21.0-cp311-abi3-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl CPython 3.11 abi3 Linux glibc 2.17+ x86-64, Linux glibc 2.5+ x86-64 Details
pygfried-0.21.0-cp311-abi3-macosx_13_0_arm64.whl CPython 3.11 abi3 macOS 13.0+ ARM64 Details

Total release size: 12.5 MB

Release files / pygfried-0.21.0.tar.gz

Download URL pygfried-0.21.0.tar.gz
Size 907.4 kB
Tags Source
SHA-256 checksum
How to use checksums
2d599a639ca156f44f79bbd76dbcf9b800b8e7f61e1452cf9bdd1c06b21f9984
BLAKE2b-256 checksum
How to use checksums
756477fc9bd03a885cb800d2cf5d2415297b44f26a370ef5add4b47c8f0c51ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / pygfried-0.21.0-cp311-abi3-win_amd64.whl

Download URL pygfried-0.21.0-cp311-abi3-win_amd64.whl
Size 3.0 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
332232747fa048d7183516389395ce9ec7e96912f667edb1b17dd210d5ec08b9
BLAKE2b-256 checksum
How to use checksums
6f03bcc7557065f265f46a60801a024633895cdcb63e4e51b6aee8476ec92c2d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / pygfried-0.21.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL pygfried-0.21.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 2.8 MB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
e8f78960a4b23822bf585e0157dfb8a7615963ebf5352947ae476070176fbc76
BLAKE2b-256 checksum
How to use checksums
d1744253c946f80ae9ab8ce472c346eb58904def9f8f6c01d8d5de5f95de62ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / pygfried-0.21.0-cp311-abi3-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl

Download URL pygfried-0.21.0-cp311-abi3-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl
Size 3.0 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 abi3
SHA-256 checksum
How to use checksums
59ae9e15f45911b50c18761a7bb8a3d22ecef336dacaac6a1e5854fd58e97b8b
BLAKE2b-256 checksum
How to use checksums
3cf3d9242c67cff528448b3af273ccbf2db4c6811b1fc54f78e226d9242630c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / pygfried-0.21.0-cp311-abi3-macosx_13_0_arm64.whl

Download URL pygfried-0.21.0-cp311-abi3-macosx_13_0_arm64.whl
Size 2.7 MB
Tags CPython 3.11 abi3 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
f4dae2a1277edd1b45390f029d2c1c157236c2bfd254a4e89f2aea4991603992
BLAKE2b-256 checksum
How to use checksums
d0899d2e9477b14c06d6ad0df6db848be284ab55c931d98bed44755ea246624f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.21.0 This release

5 release files

0.20.0

5 release files

0.19.0

5 release files

0.18.1

5 release files

0.18.0

5 release files

0.17.0

5 release files

0.16.1

5 release files

0.16.0

5 release files

0.15.1

5 release files

0.15.0

5 release files

0.14.1

5 release files

0.12.0

8 release files

0.11.0

8 release files

0.10.0

4 release files

0.9.1

3 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

3 release files

0.6.0

3 release files

0.5.0

4 release files

0.4.0

4 release files

0.3.0

4 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