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), so no descendant ever outlives your program.

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. The docs/ guide set goes 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
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
Platform support Mechanisms, all capability matrices, every caveat

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. 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, and every stage lives in one shared kill-on-exit group:

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.2.2.tar.gz (468.0 kB 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.2.2-cp314-cp314t-win_arm64.whl (1.5 MB view details)

Uploaded CPython 3.14tWindows ARM64

processkit_py-1.2.2-cp314-cp314t-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.14tWindows x86-64

processkit_py-1.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

processkit_py-1.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

processkit_py-1.2.2-cp314-cp314t-manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

processkit_py-1.2.2-cp314-cp314t-manylinux_2_28_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

processkit_py-1.2.2-cp314-cp314t-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

processkit_py-1.2.2-cp314-cp314t-macosx_10_15_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

processkit_py-1.2.2-cp310-abi3-win_arm64.whl (1.5 MB view details)

Uploaded CPython 3.10+Windows ARM64

processkit_py-1.2.2-cp310-abi3-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.10+Windows x86-64

processkit_py-1.2.2-cp310-abi3-musllinux_1_2_x86_64.whl (1.6 MB view details)

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

processkit_py-1.2.2-cp310-abi3-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

processkit_py-1.2.2-cp310-abi3-manylinux_2_28_x86_64.whl (1.5 MB view details)

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

processkit_py-1.2.2-cp310-abi3-manylinux_2_28_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

processkit_py-1.2.2-cp310-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

processkit_py-1.2.2-cp310-abi3-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: processkit_py-1.2.2.tar.gz
  • Upload date:
  • Size: 468.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for processkit_py-1.2.2.tar.gz
Algorithm Hash digest
SHA256 ba6d2aee2c7ff587f761a7f2c9a2da45519f87814f20bd63a909cf4c484812c6
MD5 c5e7845e085cc9f65a16d4ddb9cb5936
BLAKE2b-256 0f619824da200b04e0e704835b6b85d1e0a8c7cc48ee5cfd958e566ccf4b129d

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-win_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 d3104158fbee49b23c1e8e1070ef19898a92779518255e75ae35f7e7636bb46f
MD5 3e482e077d21ac9bbfdd18de5f1e404c
BLAKE2b-256 1abfb87c587033c9d2abe16a88f11d99c56bd45f7fdde44e2c69a7d4a49a399a

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 dcf28d67ef5dafb97dcea8a1343a1a6e16c5a202452f7773e24d11dead2e59d5
MD5 212ec8672737881556b44ee21030c698
BLAKE2b-256 2db2b92e3bebe2d0e0adf9873c046bd35634461ac4e8a278111ad68524355515

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7dba23b583ead5fc70c1ee0abe662cf6eb6b1311614d362266258b44c49c6d05
MD5 dbceafdf8c80e52cf1986c36e49eaa9b
BLAKE2b-256 fd22aea889ffc64e4afe091e56220b722a2ade09c105a6bdbc45d3dfcff6197c

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 39dae9cded718efc89e097bb485080a9dc4752f754f319866d65e0b431e00fa7
MD5 ca18a61ce0e4f8fd2e7341e1ce5b5753
BLAKE2b-256 c6aaf912d55daa6af764221a9509e7c4736bb0ebcbabd0ac0f5a90276c5c0d47

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2592cd50de1b4dedab502790330cae4f4f2b786d36c44a6e6a91e2f8ab95ba05
MD5 71546a17d75a5f884bf0d8e526ff8d92
BLAKE2b-256 1d1160b82c53eaa9c421cf79a6d582ac435f66f481ad70832e0d336a826dcd68

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6331ec067cc13fba8f5048a9d5a9d9804d4adc4a2f1f739742d4b1b31ae94863
MD5 01a9d2e7368d626535f784a90a453a33
BLAKE2b-256 98fc6bc9f6849ec7ab52af12010869bab9dd1c55f6972a48f3333b91b7924e3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a7fef232f00bf623378f7eb8b3d4081158ebe48b4407be5d0648ecfc9018323
MD5 500f628c6cdeaa2b97a5516ae162cd87
BLAKE2b-256 ed264e9c7920a831073abfbf17eefbb433bd8a5fc1d1a40d55efb964c72e11c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6b87d2817a914d620aba1f27b61206f78cac704b96f3205c8b25a21c82317958
MD5 d092c6de06152ea18b19dbd9e4d74733
BLAKE2b-256 e721798a0f6ab43f3383f2f4544629c6830af44977e740dc1441fba1195375fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 6ea2e91f5626d2a8f6078f1011fb828987b1569de1a9653105b5bd0259e8ffbf
MD5 a322016678846e538d31a888fd07dd6e
BLAKE2b-256 178c68303993817916fd2001d427b303b6b6db0d2757de718a1c367d557678ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 33f9fc0a67ebff9c0f877a98676f8a97697197b305fbee0fdd815f4dd63ef081
MD5 43c5d7c5a61535baaa0e0687bedc9513
BLAKE2b-256 88a76764682162b67a592a466d903a90a73fc8c39b6821e3596a2a972c000c40

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 69adba13c6889eede9b4c39a761833f781e1c939e6c69eb93a4b882a14965a28
MD5 d45e68a2d5959d4d729e2577e0c554a1
BLAKE2b-256 00fc0cb79553a488420a2799a7fc4b55292bb47275333970e8bfdea3f981e9f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 74b5f58168ae080e2df59b0a186b2e350c64f5e8eda5e4a52af7cb8bf846d067
MD5 bb7be6f5fc9b9f594a74a7aec1dc9a2a
BLAKE2b-256 6216b4eb42c513122c0733bba1535b16201c4d1f03aaeedd7e742e368283ca9c

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f02028394f6140aae4554ca84d9cd4861007dc2228385de68a99a05ce0c4559a
MD5 6293d9808f614494ac5f4f068a91ea9c
BLAKE2b-256 9e4c0e0585d406e27e6ebf8fb938347573f01c856bdc99d9a60b5e43f25175f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0768e8f284e950005e58127d33272345fe933a77666f14476f5255e97d2f5e41
MD5 05a789902c640aa81648f08427d29454
BLAKE2b-256 9100acdf230bcbf73d1f170c36e67f12d76ccf4b79d884c1b594a9401aa884b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77dd5de9af0478cee917d1874b9832bee9d25c4ef74f3cf0666f7d756ceaa638
MD5 ac64ab46a4c6b0e7ff5aa8f2f0773e38
BLAKE2b-256 82b94471639c04f1aa3b83b8001da9d67c97d55ed43b7325f3e35fcac6ed16a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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.2.2-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for processkit_py-1.2.2-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4f7a60bbbc60282ef9125f773b5702f2a269bb59780a5160b4e7b769bb8d49e9
MD5 a18674a1c4c9da9ecc450fec791a4e8f
BLAKE2b-256 6df981eb3848d5fcf3f9e9328dd094273c0ea841c48e55b6d6585e696ec23e6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for processkit_py-1.2.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