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.

Status: 1.0 — API frozen. The public API 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())

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.1.1.tar.gz (359.1 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.1.1-cp314-cp314t-win_arm64.whl (2.0 MB view details)

Uploaded CPython 3.14tWindows ARM64

processkit_py-1.1.1-cp314-cp314t-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.14tWindows x86-64

processkit_py-1.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

processkit_py-1.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

processkit_py-1.1.1-cp314-cp314t-manylinux_2_28_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

processkit_py-1.1.1-cp314-cp314t-manylinux_2_28_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

processkit_py-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

processkit_py-1.1.1-cp314-cp314t-macosx_10_15_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

processkit_py-1.1.1-cp310-abi3-win_arm64.whl (2.1 MB view details)

Uploaded CPython 3.10+Windows ARM64

processkit_py-1.1.1-cp310-abi3-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

processkit_py-1.1.1-cp310-abi3-musllinux_1_2_x86_64.whl (1.9 MB view details)

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

processkit_py-1.1.1-cp310-abi3-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

processkit_py-1.1.1-cp310-abi3-manylinux_2_28_x86_64.whl (1.8 MB view details)

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

processkit_py-1.1.1-cp310-abi3-manylinux_2_28_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

processkit_py-1.1.1-cp310-abi3-macosx_11_0_arm64.whl (1.7 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

processkit_py-1.1.1-cp310-abi3-macosx_10_12_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: processkit_py-1.1.1.tar.gz
  • Upload date:
  • Size: 359.1 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.1.1.tar.gz
Algorithm Hash digest
SHA256 062aeeb5ddfe2bf2a3d1b3780ca32f7f1be188e697de5a8f0c88c632bf6ff222
MD5 4fd69f3c4cece024b6057dcab7c56558
BLAKE2b-256 c114dfbb35c3dd1e84c49d15d5f38b866fdbdbefead0c953ff75d852f51ebc25

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 47d789da0e1d0e59479f3bd8f0f451ad87046820a919befab9d600fda6475607
MD5 892c27ad4ec00f0be712dbee131654e0
BLAKE2b-256 4ec770efb32453eb3d796eb246403a0e1a5e9e826730153c17954b4790592302

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 c971ce160f3283d632896975040b7e10fee4d78038d8f4f17e064298b8031b9d
MD5 6a68aea8fc4a891f5be8dfbabaeeeecd
BLAKE2b-256 8159585b1b06497befe6dbb02da2813597a2a3a6ab5a4f3fcb2ef064aaefe670

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6a94233b19d6a80dbd14e181acc2803fd86d1a6c590fa4c084ce342ec93ed682
MD5 051f673bd95fcf8ea2aa4127a41d4067
BLAKE2b-256 ba85ab3c574a5b9bf9c637a148cf6932fec4551fd6ec4c368120a19fd44078db

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a8767b9a7e0c395a4a620f08591fabca01aed954ddb114d0859d4f68ce238d42
MD5 070f07977a9330c80ba50d1820535626
BLAKE2b-256 b65983ef0f31fc7d2d25ec4ba705434d3b46941e94ecc81354ca4832fd2f9207

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9ffc8abfb3bb1e88b50f63530fb38c01a2f87844ee713aec27d96e6c91dae4e9
MD5 f2a1fad7626ecbd5d0d131998ff95996
BLAKE2b-256 6bc7bb5a75dc77a37fbf48fe9f6db5dd31b3791384a8261404fe795bb34f8d1e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e39d1c5936c773f8ba46d639e3038a31315831298a9f059a61ec278f8c699ca2
MD5 214487bc224a2529ebb49bef14812608
BLAKE2b-256 a5878eedbf2aee613ae775e2004558a6bea6b8c9caf246f29d707679fb719062

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5928b7fdd94eb57938c6c1fd2ea1d013a5563c5d331e8a12f4f6ac9e10434694
MD5 769e67a74668250468a94063a7b9a4ea
BLAKE2b-256 41b69c642f82c72954aad18761a9c91628e7232a5bc1e9e5589f4c758467eb43

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bcf38390a7ec3006c6383f65563dea1af3da45781d3a299ee8afe5fbc664b1e1
MD5 cfe2ea91aa7061ca2cd17d43da87a269
BLAKE2b-256 ec3400b7f6c22d4855d0db497363b8d892da48793b907e20afd4652afeb3084e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 9acd89fad1cf67d4c50a6ec2745f441ebaf6fe6bbfab659f31079164bf1dc2cf
MD5 89090ca3fce028dd42c2569641a1fed9
BLAKE2b-256 6617c82caab79a2a9f6ae4f92cef488a49ed2f3318e236b5b00facb5b6d1723d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5894cf6d816e6ab55e3fd2377ed40c40ca57184df90c55d7ef27b3bf11297668
MD5 846e8fe33359412b27c78c072f744069
BLAKE2b-256 b8d3e2e63bbdace32758980a90fd3b901d3297555461e7a90a19c0118db9d9ed

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4d140bd48e17775ed0fb7f9313a782c360ff04146881f0570ae3e474cec975ce
MD5 79a9489b5f1f785aa6070e2d59d431d9
BLAKE2b-256 c7c79070aed09ae379ba2a141d70d3fe5bc7b27ead7bb5b33e2b01be3e0ed0a4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 df7b3d3e89beb23ed4042ef8d1c8d58f3b90672851b2a7f799c1cf8bfd57461b
MD5 5875c5f0a193a76f4d4a16b358169134
BLAKE2b-256 2e69bc76d9fc05113ddb2953a21f6ab80e9a516cd3b436079e123776b8018d73

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a289e34af69bb7644d26e1a5620895d15d6a821b8be4ab81ab633cc9440d2ea6
MD5 12855df33634a5102769fbf2142c831e
BLAKE2b-256 9b98c349bcbeb01d60e51178768e8a41bbce0613bfa2394be6a5a154e7074995

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 42b085e3365b3757210d993c48a55ebbcaf2d802e60be0a18c9d1fb59626940d
MD5 542c669eaa55d909055d78aa6719b27f
BLAKE2b-256 eeb425e3b69af37a0e55dc852f391b646077af92d1d5f0a9e667176099c0da72

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a90f055e555a4b46b2268a81b398b2994e56fea05e03720a41ec6ef5b8489774
MD5 14c75bc8eecc4b736159d03554d3651b
BLAKE2b-256 1789f4ba5e6a960ef3398e446b015462e8fec8f4f3fa7b17f94037463ed6c0ea

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.1.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3f1ee0f5dd3b300c78c0b25a6d0fc424e8e0625d199a03de742fa9503553ccc7
MD5 99494268cf07e94747a44fc08cda0846
BLAKE2b-256 8695f29a5e452c8c840695d8f7f46f2921e5dc37a346ed0ea6d08a44e145a238

See more details on using hashes here.

Provenance

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