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

Uploaded CPython 3.14tWindows ARM64

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

Uploaded CPython 3.14tWindows x86-64

processkit_py-1.2.3-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.3-cp314-cp314t-musllinux_1_2_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

processkit_py-1.2.3-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.3-cp314-cp314t-manylinux_2_28_aarch64.whl (1.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14tmacOS 11.0+ ARM64

processkit_py-1.2.3-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.3-cp310-abi3-win_arm64.whl (1.5 MB view details)

Uploaded CPython 3.10+Windows ARM64

processkit_py-1.2.3-cp310-abi3-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.10+Windows x86-64

processkit_py-1.2.3-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.3-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.3-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.3-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.3-cp310-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

processkit_py-1.2.3-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.3.tar.gz.

File metadata

  • Download URL: processkit_py-1.2.3.tar.gz
  • Upload date:
  • Size: 468.4 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.3.tar.gz
Algorithm Hash digest
SHA256 293adac1bac361f602f2f8f1e14cc953b6bff24898df80d18fb329fb30d674f4
MD5 af34dd27d1f40c293dafb3525d5cb0a0
BLAKE2b-256 b316b8d09a41a4a358fb7fab6d34093c59129ed4800bdc88cd0c7eaaca69b7ba

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 c078d0cb07df3d7ef462dfd386ba3393469f2cc54eb710f4685d2295bae581b6
MD5 166f58fe19d804b05e2b17227d09fe47
BLAKE2b-256 d6ef034da90c35f0f2fe1e4886053b66f1fceadb424881e91fff511e38a926e7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 8809a3b5c2d58ecd816e1a8960d1cad20753d9bf6ef5eda884e77f6233d4d3fb
MD5 68b5b558a23ca024a4e5fed839eec624
BLAKE2b-256 fea04051408cede5bc4cfb3e8787d6427bdd31fe1b6279cc59068d661f29866e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a7df6c415574e8f269749cdb6b8913d1fa0fddc42011ec0f9ea4658c2b2d6c1a
MD5 7d8b91c19637611870c2ef194853365b
BLAKE2b-256 280f60fb1a11bb17fce1941d51e72e29c9a1f9edec8d66daab34feac37726ca9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f5f3a6f300c4501fb62b014bf7ecfacad15956d9ebb3cbcbc34bc3863260ffa8
MD5 b262d391043341bd02a9ee6ec493810b
BLAKE2b-256 191983bf1ba1a2eaff2e4aebae8b19fc169b49cbdb354da6c795670f66c100fc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8e8cee227bfd1602b2c4d7a52cccc95e54261421835f38c3d16f6fe708e635c0
MD5 c4adaf812711af190de16e449d089483
BLAKE2b-256 cb20985c8c9e9f9fb4ac5983516912dd92a5fbdcbbd18f112fb70e5495e048af

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4b25b1f794ebd08c83b544f0a0981ad432f7364729a3c7728930be343a90d5f1
MD5 cd01276c19e93159283c5d31196e1ec9
BLAKE2b-256 376737cb26ab312050272bf26f0b7bb068e972cd90ce20ed1c86070e60f8539d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 76f28d70f9d039ff9548703236a50224e29a51863f084d54357917d834ba71ea
MD5 3798cc6d21e87e70fcbd6b76dcc28769
BLAKE2b-256 bb77ecee30a149147458d017d372848ddcf9c48e6a58050ec33a3960492f7d6d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 7f12f4ac7823bba49bbddb426ed1c0b12d3c2ec4d96a88ccfc8afb2cda915062
MD5 64699172009a91f278b30774a78e061d
BLAKE2b-256 0ce4f49ad504c1d5f9785c60207406688a76ff3f02f3942c8310df49a3fe7a41

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 e4430ce661398e6d179e48cabe10d78b57ee4e14886668a58ac8c7052fe30aa4
MD5 13be22dbdc7fd080c9ab2c220257392b
BLAKE2b-256 e7152d28c5c74d29a79f800e6a6dc5170264cda4a9290785e47749fb1bdf081f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a4e6715ffc2d720ec8e73904f9954cffb6ddd94afcef187a4c354e73a117d279
MD5 e39b337011456ed2633beea0ed0d84a8
BLAKE2b-256 f27a5d14ee17b53c89a9e0e95097747d58b2dab7479b0025743fed96bf490508

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 db9ee183ac2905833ee95e5328427977094f1dd3769d8123ed5df45627a5b2d7
MD5 3ee8acaea539bd2382ee9fdcb84ea89b
BLAKE2b-256 0151186f2c2cceee6fd7658f1c7d489fc9fd99e4cc6e9007902f5344cd706775

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 107b6d34bdfdf5ad9a17a108c2922eef0a7b938200c2cf1f26b802001de45ba5
MD5 72b8285afeaf0a25c21bcda1acb1cb65
BLAKE2b-256 951400fdfe30b4fd0aa6fdfc6898fcf83a7345c62f2fe5592efdda5ccb8110e0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 90001ddde1005f5346eb5f2043d79e99d800c4b8244396e8d175d691f3eb4e6e
MD5 186954ff92de96d475c0488d3b0cfdfc
BLAKE2b-256 2ad49c731bf2411b7f3be0ed4ccaa4428cd9f0fea95b87caa71b97b10b28be19

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 98ac5fd764db9b02698ead10cbc157929cef29554dfa73df3bbc98658245f900
MD5 5754677f81e878945412a80b1c7a8c05
BLAKE2b-256 30a1c0a28b0076f5b6149c8393a26e455f91e9ee6647c3f763434cf3f22c1b90

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e9fa6f790af7371c67049dacc8c392e45062093b14e03882cdd7a4f6105b1065
MD5 2ae39204371e7a9787b25510c7cbaf8d
BLAKE2b-256 5223a39c308ce91c979451992e92a3debfccf14fb6aa752c89493e41d7fa0095

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for processkit_py-1.2.3-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7b69b1453afb42a81874e35228fa91fd4de979ad8405f7122eeaa5236d5f9046
MD5 03f1f2d1fb3487eab40f850bba715ad2
BLAKE2b-256 40bb99b5ecb633a8335b263064c31cf1a45e4bb6d25d6fb6653d4e2d7d51fb92

See more details on using hashes here.

Provenance

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