Skip to main content

processkit

Async-and-sync child-process management for Python with a kernel-backed no-orphan guarantee: every process you start — and everything it spawns — lives in a kill-on-exit container (a Windows Job Object, a Linux cgroup v2, or a POSIX process group). Subject to the documented POSIX escape caveats, normal completion, errors, timeouts, cancellation, and context-manager exit reap descendants as a unit. Abrupt owner-death coverage is platform-specific and reported explicitly.

Beyond spawning a subprocess: run-and-capture, line streaming, interactive stdin, shell-free pipelines, readiness probes, timeouts & cancellation, supervision with restart/backoff, resource-limited sandboxes, and a mockable runner seam for subprocess-free tests — each in a synchronous and an asyncio-native form.

CI CodeQL PyPI Python License: MIT

from processkit import Command

# Require success and get trimmed stdout; a failure raises a typed exception.
version = Command("python", ["--version"]).run()
print(version)

Cover

Why processkit?

subprocess and asyncio.subprocess reach (at most) the direct child. The processes it spawned — a build tool's compiler children, the real payload behind a wrapper (cmd /c …, sh -c …), a test's helper servers — survive a timeout, an exception, or a cancelled task, and keep running as orphans.

processkit spawns every child into the operating system's own containment primitive — a Job Object on Windows, a cgroup v2 on Linux (with a process-group fallback), a POSIX process group on macOS/BSD — so teardown is a kernel operation over the whole tree, not a best-effort signal to one pid:

  • Nothing escapes silently. Exiting a with / async with block reaps every descendant, grandchildren included. Where a mechanism has a genuine weakness (a setsid child can escape a POSIX process group), ProcessGroup.mechanism reports the active backend instead of pretending — never a silent downgrade.
  • Sync and async, first-class. The run-&-capture verbs, pipelines, and supervision each exist as a plain synchronous call and an a-prefixed asyncio coroutine, sharing one set of types. The inherently-streaming surfaces — live line streaming, interactive stdin, readiness probes — are asyncio-native (awaited on a started process), not duplicated as blocking calls.
  • Honest results. A non-zero exit is data (ProcessResult) until you ask for success; a timeout is captured in the result; a cancellation is always an error; every platform divergence raises Unsupported or is documented. Raised exceptions carry structured fields and alias the stdlib's (Timeout is a TimeoutError, ProcessNotFound a FileNotFoundError, PermissionDenied a PermissionError).
  • Testable. One runner seam swaps the real spawner for scripted doubles or record/replay cassettes — no subprocess in your tests.

How it compares

whole-tree kill-on-exit async sync limits / stats streaming · pipelines · supervision
subprocess
asyncio.subprocess
processkit

The first column is the differentiator: a child's descendants are contained and reaped as a unit (Job Object / cgroup v2 / process group), not just the direct child.

Stable API. The public API has been stable since 1.0 and follows Semantic Versioning: breaking changes land only in a new major version, so 1.x upgrades are backward-compatible. See CHANGELOG.md, and ROADMAP.md for how it was built.

The hard platform work — Job Object containment, cgroup v2, race-free spawn, POSIX process groups — runs in a compiled native core, so the Python layer stays a thin, typed, asyncio-native surface with context-manager teardown.

Install

pip install processkit-py   # the import name is `processkit`

Distributed as abi3 wheels for CPython 3.10+ (one wheel per OS/arch runs on every supported minor version, 3.14 included), plus a version-specific free-threaded wheel for CPython 3.14t (PEP 703 — importing the extension does not re-enable the GIL). See the PyPI project page for released versions and files; platforms without a prebuilt wheel build from source — see below.

Picking a verb

Every run starts with the same Command builder; the verb you finish with decides what you get back. Each has an a-prefixed asyncio twin (run/arun, …):

You want Call You get
stdout, success required .run() trimmed str; non-zero exit / timeout / kill → typed exception
the full outcome, exit code as data .output() / .output_bytes() ProcessResult / BytesResult — code, stdout, stderr, timed_out; never raises on a non-zero exit
just the exit code .exit_code() int (a timed-out / killed run raises instead of inventing -1)
a yes/no answer .probe() bool — exit 0 → True, 1 → False, anything else raises
a live handle — streaming, stdin, probes .start() / .astart() RunningProcess

The run-to-completion verbs repeat on the Runner and CliClient layers too (start / astart live on Command and Runner). Deeper: Running commands.

Quick start

from processkit import Command, ProcessGroup

# Capture output; a non-zero exit does not raise on its own.
result = Command("git", ["rev-parse", "HEAD"]).output()
print("HEAD is", result.stdout.strip(), "·", result.code)

# Require success and get trimmed stdout directly.
version = Command("python", ["--version"]).run()

# Feed stdin.
sorted_out = Command("sort").stdin_text("banana\napple\n").run()

# Share one kill-on-exit group across several children; the block exit reaps the
# whole tree, grandchildren included.
with ProcessGroup() as group:
    group.start(Command("dev-server"))
    # ... work ...
# graceful teardown on exit

The asyncio surface mirrors it with the a prefix and adds streaming:

import asyncio
from processkit import Command, ProcessGroup

async def main():
    result = await Command("git", ["rev-parse", "HEAD"]).aoutput()

    # Stream a child's stdout; the context manager reaps the tree on exit.
    async with await Command("my-build", ["--watch"]).astart() as proc:
        async for line in proc.stdout_lines():
            print(line)

    async with ProcessGroup() as group:
        await group.astart(Command("dev-server"))

asyncio.run(main())

No Python to write? python -m processkit run -- <cmd> [args...] gives a shell script or CI step the same kill-on-exit containment and resource limits from the command line, no code required:

python -m processkit run --timeout 30 --max-memory 536870912 -- pytest -x

See Command-line usage for the full flag list and exit-code contract.

Documentation

This README is the quick tour. Read the rendered documentation site for the navigable guide set, or browse its Markdown sources. The guides go deeper on every capability, with more examples and the platform fine print in one place. New here? Skim the Cookbook first — it maps "I want to …" tasks to working snippets — then read Running commands end to end:

Guide Covers
Cookbook Task → snippet recipes for everything below; the fastest way in
Coming from subprocess Translating your subprocess / asyncio.subprocess code, and what containment adds
Running commands The full Command builder and every consuming verb, with error semantics
Process groups Containment, teardown, signals, suspend/resume, members, limits, stats
Sandboxing untrusted tools A bounded agent/tool recipe and an explicit threat model
Streaming & interactive I/O Line streaming, conversational stdin, readiness probes, per-run profiling
Pipelines Shell-free a | b | c, pipefail attribution, chain timeouts
Timeouts & cancellation Captured vs raised deadlines, Ctrl+C, asyncio cancellation
Supervision Restart policies, backoff & jitter, stop conditions, outcomes
Testing your code The runner seam, scripted/record-replay doubles, CliClient
Command-line usage run, supervise, doctor, profiling, limits, flags, and exit codes
Performance & overhead Benchmark scope, reproduction, and qualitative scaling expectations
Async runtimes & event loops asyncio, uvloop, anyio compatibility, and unsupported runtimes
Platform support Mechanisms, all capability matrices, every caveat
Troubleshooting Symptom-first guidance for limits, signals, loops, cassettes, and teardown
API reference Every public class, function, protocol, alias, and exception
Architecture Python/PyO3/Rust boundaries, conventions, and drift guards

Prefer whole programs to snippets? The examples/ directory has runnable, self-contained scripts — one per niche (no-orphan teardown, a readiness-gated server, supervision, a resource-limited sandbox). Each runs on Windows, Linux, and macOS and is exercised in CI.

A tour of the capabilities

Each section below is a taste with a pointer to its full guide.

Containing a process tree

Everything started in a ProcessGroup — and everything those processes spawn — is reaped when the block exits:

from processkit import Command, ProcessGroup

with ProcessGroup() as group:
    group.start(Command("dev-server"))
    group.start(Command("worker"))
    print(group.mechanism)        # "job_object" | "cgroup_v2" | "process_group"
    print(group.members())        # live member pids
# the whole tree, grandchildren included, is gone here

The with / async with exit (and ordinary GC) reaps the tree on every platform; surviving a hard kill of the Python process itself is a Windows-only property. Lean on the context managers, not __del__ / atexit. Deeper: Process groups · Platform support.

Sandboxing with resource limits

Bound a whole tree's memory, process count, and CPU at creation, so a runaway or untrusted child tree can't exhaust the host:

from processkit import Command, ProcessGroup

tool = (
    Command("untrusted-tool")
    .env_clear().inherit_env(["PATH"])     # locked-down environment
    .output_limit(max_bytes=8 * 1024 * 1024)
)
with ProcessGroup(max_memory=512 * 1024 * 1024, max_processes=64, cpu_quota=1.0) as group:
    group.start(tool)
    print(group.stats().active_process_count)

Limits need a Windows Job Object or a Linux cgroup-v2 root; under a container, systemd session, or other non-root cgroup the kernel forbids them and ResourceLimit is raised — never a silently-unbounded group. Deeper: Process groups → resource limits.

Signalling and pausing the whole tree

with ProcessGroup() as group:
    group.start(Command("my-server"))
    group.signal("hup")        # term | kill | int | hup | quit | usr1 | usr2
    group.suspend()            # freeze the whole tree…
    group.resume()             # …and let it run again

Signals are POSIX-real; on Windows only kill is deliverable (it maps to the Job Object terminate) and every other name — including term — raises Unsupported. Deeper: Process groups.

Running many at once

output_all runs a whole batch with a concurrency cap, so fanning out hundreds of commands can't exhaust file descriptors or the process table:

from processkit import Command, ProcessResult, output_all

cmds = [Command("convert", [f"{i}.png", f"{i}.jpg"]) for i in range(200)]
results = output_all(cmds, concurrency=8)            # never >8 alive at once
failed = sum(not (isinstance(r, ProcessResult) and r.is_success) for r in results)

It is collect-all: each slot is one command's ProcessResult, or a ProcessError for a spawn/I/O failure — a non-zero exit never short-circuits the batch. aoutput_all / output_all_bytes / aoutput_all_bytes round out the set. Need results as they finish instead? aoutput_as_completed (and its aoutput_as_completed_bytes twin) streams each (index, result) pair the moment its command completes, under the same concurrency cap and no-orphan teardown. Deeper: Cookbook → run many at once.

Supervising a long-lived child

A Supervisor keeps a child alive: it restarts the command per policy whenever it exits, with bounded restarts and exponential, jittered backoff:

from processkit import Command, Supervisor

outcome = Supervisor(
    Command("my-server", ["--port", "8080"]),
    restart="on_crash",           # always | on_crash | never
    max_restarts=5,
    backoff_initial=0.2, backoff_factor=2.0, max_backoff=30.0,
    stop_when=lambda r: r.code == 0,   # a clean exit ends supervision
).run()                                # or: await ....arun()
print(outcome.restarts, outcome.stopped)

Deeper: Supervision.

Waiting for a child to be ready

"Start a server, then use it" needs the server to be ready, not merely started. Three async probes replace the arbitrary sleep:

from processkit import Command, wait_until, wait_for_port, wait_for_line

proc = await Command("my-server").astart()
lines = proc.stdout_lines()
await wait_for_line(lines, "listening on", timeout=10)                  # a log line
await wait_for_port("127.0.0.1", 8080, timeout=10)                      # a TCP port
await wait_until(lambda: health_check(), timeout=10, interval=0.1)      # any condition

A probe that doesn't pass in time raises WaitTimeout (ProcessError, TimeoutError) and does not kill the child — you decide what happens next. Deeper: Streaming → readiness probes.

Pipelines without a shell

a | b | c without a shell string — stages connected in-process (a relay, not a shell), so no quoting or injection surface. Each stage lives in its own kill-on-exit sub-group; chain-wide teardown still reaches every stage:

authors = (
    Command("git", ["log", "--format=%an"])
    | Command("sort")
    | Command("uniq", ["-c"])
).run()

The outcome is pipefail: stdout is the last stage's, while the exit code, stderr, and reported program come from the first stage that didn't exit cleanly. .timeout(d) bounds the whole chain. Deeper: Pipelines.

Environment and privileges

Command("worker").inherit_env(["PATH", "HOME", "LANG"]).run()        # allow-list on a cleared env
Command("worker").gid(1000).groups([1000]).uid(1000).setsid().run()  # POSIX: drop privileges, new session
Command("helper").create_no_window().run()                           # Windows: no console window
Command("daemonish").kill_on_parent_death().start()                  # die with a hard-killed parent

uid/gid/groups/setsid are POSIX-only — on Windows the run raises Unsupported rather than silently skipping a privilege drop. When dropping privileges, set all three of gid/groups/uiduid alone leaves the child holding the parent's (often root's) supplementary groups. Deeper: Running commands → privileges.

Cancelling a run

A blocked sync call honors Ctrl+C (raises KeyboardInterrupt and reaps the tree). Cancelling an awaited async run — directly, or via asyncio.wait_for / asyncio.timeout — tears down the whole tree and raises asyncio.CancelledError:

import asyncio

task = asyncio.ensure_future(Command("long-job").aoutput())
task.cancel()        # the process tree is reaped; CancelledError propagates

Unlike a timeout — whose expiry is captured in the result as timed_out — cancellation is always terminal. Deeper: Timeouts & cancellation.

Async streaming and interactive stdin

The one-shot verbs buffer the whole output. For long-running or conversational children, astart() returns a live RunningProcess:

# Conversational stdin: write a request, read the response.
proc = await Command("bc").keep_stdin_open().astart()
stdin = proc.take_stdin()
await stdin.write_line("2 + 2")
print(await anext(proc.stdout_lines()))   # 4
await stdin.close()

Deeper: Streaming & interactive I/O.

Wrapping a CLI tool

CliClient binds a program to default timeout/env, so repeated calls pass only their args:

from processkit import CliClient

git = CliClient("git", default_timeout=30.0)
head = git.run(["rev-parse", "HEAD"])     # or: await git.arun([...])
clean = git.probe(["diff", "--quiet"])

For testable code, pass runner= (a ScriptedRunner and friends) to CliClient itself, the same way Command accepts an injected runner. Deeper: Testing your code.

Testing without spawning processes

Write your code against a runner, then inject a ScriptedRunner in tests (the test doubles live in the processkit.testing submodule):

from processkit import Command
from processkit.testing import Reply, ScriptedRunner

scripted = ScriptedRunner()
scripted.on(["git", "rev-parse"], Reply.ok("deadbeef"))
assert scripted.run(Command("git", ["rev-parse", "HEAD"])) == "deadbeef"

RecordReplayRunner captures real tool output once and replays it offline, and RecordingRunner spies on what your code ran. Deeper: Testing your code.

Seeing what ran (observability)

Opt in once and processkit forwards its internal run events to Python's logging — useful when a spawn or teardown misbehaves in production:

import logging
from processkit import Command, enable_logging

logging.basicConfig(level=logging.DEBUG)
enable_logging()                          # idempotent; off by default

Command("git", ["rev-parse", "HEAD"]).run()
# DEBUG:processkit:child spawned program=git pid=Some(12345) mechanism=…

Records land on the processkit logger (filter it like any other); argv and env are never logged (they routinely carry secrets). Deeper: the logging recipe.

Stability

processkit follows Semantic Versioning. As of 1.0 the public API — everything re-exported from import processkit and declared in the type stubs — is stable: breaking changes land only in a new major version, so 1.x upgrades are backward-compatible. Anything underscore-prefixed is internal.

Requirements

  • Python 3.10 or later (abi3 wheel), including CPython 3.14 and the free-threaded (PEP 703) build 3.14t.
  • See platform support & caveats for per-OS behaviour and the wheel/architecture matrix.

Building from source

pip install processkit-py (the import name is processkit) covers every platform with a prebuilt wheel — see the PyPI project page for the current release. On a platform without a prebuilt wheel (32-bit targets), build from source instead (see CONTRIBUTING.md for the build prerequisites):

git clone https://github.com/ZelAnton/processkit-py
cd processkit-py
pip install .

Contributing

See CONTRIBUTING.md for build/test instructions and conventions. To report a security issue, follow SECURITY.md.

License

This project is licensed under the MIT License.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

processkit_py-1.4.2.tar.gz (4.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

processkit_py-1.4.2-cp314-cp314t-win_arm64.whl (1.7 MB view details)

Uploaded CPython 3.14tWindows ARM64

processkit_py-1.4.2-cp314-cp314t-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.14tWindows x86-64

processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

processkit_py-1.4.2-cp314-cp314t-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

processkit_py-1.4.2-cp314-cp314t-macosx_10_15_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

processkit_py-1.4.2-cp310-abi3-win_arm64.whl (1.7 MB view details)

Uploaded CPython 3.10+Windows ARM64

processkit_py-1.4.2-cp310-abi3-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

processkit_py-1.4.2-cp310-abi3-musllinux_1_2_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

processkit_py-1.4.2-cp310-abi3-musllinux_1_2_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

processkit_py-1.4.2-cp310-abi3-manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

processkit_py-1.4.2-cp310-abi3-manylinux_2_28_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

processkit_py-1.4.2-cp310-abi3-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

processkit_py-1.4.2-cp310-abi3-macosx_10_12_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file processkit_py-1.4.2.tar.gz.

File metadata

  • Download URL: processkit_py-1.4.2.tar.gz
  • Upload date:
  • Size: 4.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for processkit_py-1.4.2.tar.gz
Algorithm Hash digest
SHA256 8243a148392f07bd54727b1db3b199743a5cafd5b80c096186f8f55301995f4b
MD5 0b487f15496e9115776410325aaf0eff
BLAKE2b-256 0b478149fb5748aca5b99dcc6d2747236e698356d16ec13c92b64c165be50ab9

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2.tar.gz:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-win_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 2138bb030c91bb65eec24192f92c218c100fbd6292e78ae560e578882edc63d5
MD5 edacef516da8217863582e8bac4e01c5
BLAKE2b-256 6ab20698aaa2737cd5ea3039e4f5b978c25820df0b585ce5620cf7012fe0d6ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-win_arm64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 0e3d5c261a8cbe2f758f1ab8e202eee918e97aed0af4ea9f6da9bd6f62288b70
MD5 aaef671f4b032e0dcd7fd536bba25ea0
BLAKE2b-256 c7e7ed2733aa966e6e01f8b3fc730879309cbdf9797ef3f96719291d4b0b753f

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-win_amd64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2e95bfe39fdf99ec00ab1ae19853e41937fd6eb18f1a09837725d6f2670d0efc
MD5 c56edc511abaf85a1b16eeb7db8c676b
BLAKE2b-256 214d8f45ebb60dd74b51ae8d389fbac968b716b717eff2b4dbf5d2e536dee66c

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0f7f1987b7d71b89e92b1ee9f35de05f0dadb2e2f4b8c21d375f15605809dc31
MD5 a6429d57664a4ba8712ee5d4ca93495a
BLAKE2b-256 4ba1866a74f46304d53a3d3de62f9f83aafd594c9225dd1681efb3f4f536e26d

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4d737a6136150dc3cdc39e4e7716eb9e9cbfc379a1c158d7a44aa72d8068fc77
MD5 f8f7571e3832ad1473507fc19b17c25e
BLAKE2b-256 5977e708fe313ff8a7e3fd9ba1eb002bfd5e0cd23ada951a89ffa214177f3e06

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 22847590cc66da09decdc9de67c5ff741841afbae186028dc84a2202a3f31260
MD5 85ed5d69aefa9b48a4d7ce1ffdfc2e9a
BLAKE2b-256 c74086acb2328ad841e0955b6afca7046b6ae6034494e8b2ffd38747eb7deb3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-manylinux_2_28_aarch64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36789826796912a2f1e086252b2aaa3ded0f4c22ec5b45636454b22bc0b0f5ca
MD5 85d9553f2bbb53bea6cbb39b9df1f20c
BLAKE2b-256 2216f76f1e01790b562e3690ad265666281c638c12ff8b875023c9c853112578

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f58c42feb329044c830ff7e9994f305ec95a84a508a4f5ada9e30b6dfaa238ab
MD5 abcac9cce4c1580d4bc508ed1f3cc769
BLAKE2b-256 83a25c372926e2db15506a41b4a92e2c6a7024342bf33de18e35b57fccbd922d

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp314-cp314t-macosx_10_15_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 f48573d2c577479a5f5aeb3299df2325c727af7cbc8d129b333ac13dc0fd6b00
MD5 a66cc80c1bfe1c6658df2449cc18dcb8
BLAKE2b-256 a711c2cac981d6f9646729ed3cf20a8e0e2b4115b6723d8e4b63bdc701403be4

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-win_arm64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 79ba6821bf67dcabc7e9c0be71a4b386e05d9170d000ea14d1e333418056f6a3
MD5 5b37e06e8e844ce43ad8cfc5a3da1d54
BLAKE2b-256 f0f33d25b2df8918421075358ef64047df1b8edd0f63d575f04435159dde49e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-win_amd64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5181855c030f3714d1f03d553d98f6c88a90f8b11a85814b7c1dc84113e1b928
MD5 fafef6e97762c8fd247d80cddcf00dbe
BLAKE2b-256 32e5424b6927cba0a92b3b8793d247eb88e287dfd6500a5694efc98b172f64e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-musllinux_1_2_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ed53a0a0abd4a291b8538e10fadb52ff36baabd9771a192c42b2011bf16a8906
MD5 743da03243ee8b4a421c90e27d807ed2
BLAKE2b-256 046992ad8ac3d37f7840b3c1f1fa9e7dd41df641619fa63d63ec8082739d693d

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-musllinux_1_2_aarch64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d6eddc03571a9a45bf73b0028ddaa2451d851a3f187a8bfbc3ca556fbe0c5d12
MD5 1a5f1c73aaa15505d68294ec63c7a691
BLAKE2b-256 4cff7d1e468b8c094bcb97e74580101d7fd1e8eeaa37832dbf7f1216971ff0d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bcde30bdf7978521f4d47b4f101e056e3f4ed5c101d38b3a22456ddd5ed2f31d
MD5 ba92bddba0f704c344f7173fb086f7b1
BLAKE2b-256 37bca187c304be2e29e78a72bd56bd3be363032f34ccff5caddcbeb8ac0254c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34e975e2f741cb52e578ed86361158ec3621c026ef160f3c1dcb43e0c30dbe57
MD5 8975a68fa534b0d8b848251d785818b6
BLAKE2b-256 8a052394d4d43ec59d9da74f647eccf2a0df768830667aca13f1f826d7a4a25b

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file processkit_py-1.4.2-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.4.2-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8e07247363c95f391cb53b2fd36a13a67e804cd37dbff7aed17e4ac27aa974df
MD5 ba9a38d4068774b44474d2b6973b65be
BLAKE2b-256 bceb39e19a07ff1e4c9c732ec5213db0407940985d2fe5f440511379ca9e314c

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.4.2-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on ZelAnton/processkit-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page