Pygfried
pygfried is a CPython extension that brings siegfried - a powerful, signature-based file format identification tool written in Go - into the Python ecosystem.
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 byScanner()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.20.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pygfried-0.20.0.tar.gz | 882.7 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| pygfried-0.20.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| pygfried-0.20.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| pygfried-0.20.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.5+ x86-64, Linux glibc 2.17+ x86-64 | Details |
| pygfried-0.20.0-cp311-abi3-macosx_13_0_arm64.whl | CPython 3.11 | abi3 | macOS 13.0+ ARM64 | Details |
Total release size: 12.4 MB
Release files / pygfried-0.20.0.tar.gz
| Download URL | pygfried-0.20.0.tar.gz |
|---|---|
| Size | 882.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a17edac3f6cc7f747bf451e950f2302896daef61f2613f5f55e8793aadcf6bb
|
|
BLAKE2b-256 checksum How to use checksums |
bef04e97b6649f25aef309ff67c17ec1c2e070ba702738e0aaa8652aaaef92fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency logRelease files / pygfried-0.20.0-cp311-abi3-win_amd64.whl
| Download URL | pygfried-0.20.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 |
709d83deb4bb4900e48f3f9056e74c813523094603e99818c0216f24a75e580d
|
|
BLAKE2b-256 checksum How to use checksums |
57da10c7fa9ca90dfccb594ff64f3beb96026105befdf8c71609a3df87690224
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency logRelease files / pygfried-0.20.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | pygfried-0.20.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 |
19731c7d1c0451d07718bcc61194d508251bfb3a553e3bbf568f10b62cf9789a
|
|
BLAKE2b-256 checksum How to use checksums |
866ca0319f9a96bf65bd7a0a89351080c5ee8ade65ef64ccfb471d80c4f82825
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency logRelease files / pygfried-0.20.0-cp311-abi3-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl
| Download URL | pygfried-0.20.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 |
0c57da0c2c399a62f23876974ce89c114173a367e8e23d28dea6639b569dc552
|
|
BLAKE2b-256 checksum How to use checksums |
e78b1a81c3b30ea5e4cd4cec8e68a490377029c3f10f945806b448ece0421802
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency logRelease files / pygfried-0.20.0-cp311-abi3-macosx_13_0_arm64.whl
| Download URL | pygfried-0.20.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 |
61343c9645405c93bfce0281ec43f143998a5269d6ad990d263b46b2a1e5844f
|
|
BLAKE2b-256 checksum How to use checksums |
cad0232d79cbe5fdd7f140b6385fde00365247df24fd65595f99e7b4434bcd62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 10, 2026.
Transparency log