Skip to main content

Small Python wrapper around Linux io_uring

Project description

uring-api

uring-api is a small Python wrapper around Linux io_uring.

The goal is deliberately modest: expose enough of the native ring lifecycle, socket send/recv submission, completion waiting, and callback delivery to build higher-level completion abstractions in Python. It does not implement an event loop, scheduler, or asyncio compatibility layer.

Future work is tracked in ROADMAP.md, including queue resizing, optional zero-copy receive models, and specialised kernel tuning.

Quick Check

import uring_api

print(uring_api.probe())

with uring_api.Ring() as ring:
    print(ring.fd)

Socket I/O

Ring currently exposes submit_recv(), submit_recv_multishot(), submit_send(), submit_send_zc(), submit_recvmsg(), submit_sendto(), submit_sendmsg(), submit_sendmsg_zc(), submit_accept(), submit_accept_multishot(), submit_connect(), submit_shutdown(), submit_close(), submit_socket(), and wait(). This is the complete baseline for Python-oriented socket I/O in uring-api: normal sends and receives, message-oriented operations, listener accept paths, connection setup, orderly shutdown, fd creation/close, cancellation, and the practical multishot server cases all have direct wrappers. Each submitted operation carries a Python user_data object which comes back with its completion.

import socket
import uring_api

reader, writer = socket.socketpair()
try:
    reader.setblocking(False)
    writer.setblocking(False)

    with uring_api.Ring() as ring:
        token = {"operation": "greeting"}
        buf = bytearray(5)
        ring.submit_recv(reader.fileno(), buf, token)
        writer.send(b"hello")

        completion = ring.wait(1.0)

    assert completion is not None
    assert completion.user_data is token
    assert bytes(buf) == b"hello"
    print(completion.res, completion.result)
finally:
    reader.close()
    writer.close()

For sends, uring-api keeps the exported buffer alive until the kernel reports the completion. That avoids copying the outgoing payload into an internal bytes object just to keep memory valid. submit_send_zc() uses IORING_OP_SEND_ZC, while submit_sendmsg_zc() uses IORING_OP_SENDMSG_ZC for the sendmsg shape. Their ordinary operation CQE is delivered as the submitted Completion; the later IORING_CQE_F_NOTIF buffer-lifetime CQE is consumed internally and releases the retained buffer.

submit_shutdown() is a socket operation and mirrors shutdown(fd, how). submit_accept() and submit_accept_multishot() accept optional accept flags; pass socket.SOCK_NONBLOCK | socket.SOCK_CLOEXEC when accepted sockets should be ready for proactor ownership without a follow-up fcntl() call. submit_close() is lower-level: pass only a raw fd whose ownership has already been transferred away from Python objects such as socket.socket, for example with detach(). Otherwise, Python and the kernel may both believe they own the same descriptor.

submit_recv_multishot() owns an internal provided-buffer ring for the pending operation. Each receive CQE is copied into a new Python bytes object, the selected kernel buffer is recycled right away, and the delivered completion gets a sequence number so callback users can reconstruct receive order even when worker threads dispatch completions out of order. Multishot completions are numbered from 0; normal one-shot completions also report sequence == 0.

The local liburing headers expose more socket-adjacent operations than this wrapper publishes, but those are intentionally outside the core Python-oriented surface. Readiness polling is optional for a completion proactor, fixed-buffer send variants and public provided-buffer ownership are a poor fit for normal Python buffer lifetimes, and socket command or NAPI controls are specialised tuning hooks. The one receive-side extension still worth exploring is a zero-copy multishot receive model with explicit leased-buffer ownership. Those items are tracked in ROADMAP.md rather than implied by probe(), which remains a compact runtime availability check.

If the submission queue cannot provide another entry after flushing already prepared work to the kernel, submit methods raise SubmissionQueueFull. Treat that as backpressure rather than as a permanent ring failure: wait for completions, then retry or let a higher-level proactor defer the submission.

Checking Availability

io_uring availability depends on more than the Python package importing successfully. The kernel, container sandbox, seccomp profile, and process limits can all affect whether a ring can actually be created.

Use probe() when you want a compact availability and capability dictionary:

import uring_api

probe = uring_api.probe()

if probe:
    print("io_uring is available")
    print("capabilities:", probe)
else:
    print("io_uring is not available")

Use is_available() when you only need a boolean:

import uring_api

if not uring_api.is_available():
    raise RuntimeError("io_uring is not available in this environment")

probe() creates a tiny temporary ring and closes it right away. If that fails, it returns an empty dictionary. If it succeeds, the dictionary contains "available": True plus named optional capabilities such as "IORING_ACCEPT_MULTISHOT", "IORING_RECV_MULTISHOT", and "IORING_OP_SEND_ZC" and "IORING_OP_SENDMSG_ZC". Production code should still handle OSError when it creates the real ring because limits or sandbox policy may differ for larger settings.

Pass setup flags to probe(flags=...) to check whether this build and kernel combination accepts a ring mode before using it for the real ring:

import uring_api

flags = uring_api.IORING_SETUP_SINGLE_ISSUER
probe = uring_api.probe(flags=flags)

if probe:
    print("setup flags accepted")
else:
    print("setup flags rejected")

Some flags also impose application-level contracts. For example, IORING_SETUP_SINGLE_ISSUER means callers must submit SQEs from a single owning thread even on kernels that accept the flag.

The compiled liburing version fields report the header version used to build the binary extension. This is useful in CI because Linux distribution images can compile the same Python package against different liburing development packages while still running on the hosted runner's kernel.

submit_send_zc() is best gated with probe()["IORING_OP_SEND_ZC"]. Unsupported systems may accept the submission and then report ENOTSUP or EOPNOTSUPP in the operation CQE, so checking a kernel version is less useful than submitting a small runtime probe. probe() reports both "IORING_OP_SEND_ZC" and "IORING_OP_SENDMSG_ZC" for caller convenience, and derives both from the simpler sendmsg_zc UDP loopback probe with a bound local receiver. If your CI image is expected to support these operations, make that expectation explicit:

uv run --active python - <<'PY'
import uring_api

probe = uring_api.probe()
print(probe)
raise SystemExit(0 if probe.get("IORING_OP_SEND_ZC") and probe.get("IORING_OP_SENDMSG_ZC") else 1)
PY

If the native extension cannot be imported after installation, importing uring_api still succeeds and probe() returns {}. Source builds with unsupported native dependencies warn and install the pure Python wrapper without _uring_api.

The IORING_ACCEPT_MULTISHOT capability uses a runtime operation probe rather than a kernel version check. It creates a private temporary ring and loopback listener, submits one multishot accept request, connects a local client, and checks whether the first accept completion keeps the request armed. If the build headers do not expose the helper flag, the capability simply reports False.

The IORING_RECV_MULTISHOT capability is also checked with a runtime operation probe because it requires newer kernel support than multishot accept. It creates a private socket pair and provided-buffer ring, submits one multishot receive, sends one byte, and reports True only if the first completion selects a buffer and keeps the request armed with IORING_CQE_F_MORE.

Initialising a Ring

The current wrapper exposes the native ring lifecycle. A ring is a file descriptor plus shared submission/completion queues owned by the process.

import uring_api

with uring_api.Ring(entries=8) as ring:
    print("fd:", ring.fd)
    print("kernel features:", ring.features)
    print("submission entries:", ring.sq_entries)
    print("completion entries:", ring.cq_entries)

entries is the requested submission queue depth. The kernel may round or size the actual submission and completion queues, so inspect sq_entries and cq_entries after initialisation if the exact capacity matters.

Pass flags= to request setup modes that were accepted by probe(flags=...):

import uring_api

flags = uring_api.IORING_SETUP_SINGLE_ISSUER

if uring_api.probe(flags=flags):
    with uring_api.Ring(entries=8, flags=flags) as ring:
        ...

The constructor passes these flags to io_uring_queue_init_params() for the real ring. The application is still responsible for the contracts implied by each flag; for example, IORING_SETUP_SINGLE_ISSUER requires all submissions to come from the owning thread.

If initialisation fails, the constructor raises OSError:

import errno
import uring_api

try:
    ring = uring_api.Ring(entries=256)
except OSError as exc:
    if exc.errno == errno.EPERM:
        raise RuntimeError("io_uring is blocked by seccomp or policy") from exc
    if exc.errno == errno.ENOMEM:
        raise RuntimeError("io_uring could not allocate or pin the requested resources") from exc
    raise
else:
    try:
        print(ring.fd)
    finally:
        ring.close()

Threading Model

Ring deliberately stays close to liburing's shared-ring model, but the Python object adds native locking around the parts that matter for normal use.

The intended baseline is simple:

  • one thread may reap completions with wait();
  • other threads may call submit-side methods such as submit_recv(), submit_recv_multishot(), submit_send(), submit_send_zc(), submit_recvmsg(), submit_sendto(), submit_sendmsg_zc(), submit_accept(), submit_accept_multishot(), submit_connect(), and break_wait();
  • break_wait() is safe to call while another thread is blocked in wait();
  • multiple concurrent wait() calls are serialised by the Ring object;
  • alternatively, callers may start their own Python threads and have each one call serve_completions() to wait for completions and call the callback directly.

break_wait() prepares and submits an internal NOP. When the reaper consumes that completion, wait() returns None rather than a user completion.

Serving workers use the same receive side as wait(), so public wait() calls raise RuntimeError while they are running. Each worker calls serve_completions(), then loops until stop_serving() asks the service to exit. Workers compete for an internal wait lock, so only one worker is inside io_uring_wait_cqe() at a time, while another worker can dispatch a completion callback.

stop_serving() asks workers to exit and wakes the active waiter with break_wait(). The caller owns the threads, so the caller must join them before closing the ring; close() and __exit__() raise while completion service is still active. reset_serving() clears the stop flag so a fresh set of workers can enter serve_completions() again. If a callback raises, the exception is reported as unraisable and the worker group exits.

Native C clients can register a worker-thread callback through the C API. When a C callback is present, the serving worker calls it instead of Ring.callback; otherwise it falls back to the Python callback property.

import uring_api
import threading


def delivered(completion):
    print(completion.user_data, completion.res, completion.result)


with uring_api.Ring() as ring:
    ring.callback = delivered
    threads = [threading.Thread(target=ring.serve_completions) for _ in range(2)]
    for thread in threads:
        thread.start()
    try:
        ring.submit_recv(fd, bytearray(4096), 200)
    finally:
        ring.stop_serving()
        for thread in threads:
            thread.join()

close() is still an owner-coordinated shutdown operation for submissions. Do not close a ring while another thread may submit new user operations.

C API

Native clients can include uring_api_capi.h and import _uring_api._C_API with PyCapsule_Import(). Use uring_api.get_include() to find the installed header directory when compiling an extension module.

The capsule currently exposes:

  • abi_version, struct_size, and feature_flags for compatibility checks;
  • compiled_liburing_major and compiled_liburing_minor for build-time header visibility;
  • probe(entries, flags), which returns a new reference to the same flat availability and capability dictionary as _uring_api.probe();
  • ring_new(), lifecycle helpers, metadata helpers, ring_submit_recv(), ring_submit_recv_multishot(), ring_submit_send(), ring_submit_send_zc(), ring_submit_recvmsg(), ring_submit_sendto(), ring_submit_sendmsg(), ring_submit_sendmsg_zc(), ring_submit_accept(), ring_submit_accept_multishot(), ring_submit_connect(), ring_submit_shutdown(), ring_submit_close(), ring_submit_socket(), ring_break_wait(), and ring_wait();
  • ring_set_callback(), ring_set_c_callback(), ring_serve_completions(), ring_stop_serving(), and ring_reset_serving() for completion-service control;
  • completion_check(), completion_user_data(), completion_res(), completion_flags(), completion_sequence(), and completion_result() for native completion inspection.

Check URING_API_CAPI_FEATURE_CORE before calling the function table. The flag describes the capsule API surface, not runtime kernel support for individual operations. Use probe() to check whether this process can create a ring and to read runtime support for optional operation helpers from the returned flat dictionary. A C completion callback receives the ring object, the completion object, and the supplied user_data. Return 0 for success; return a negative value with a Python exception set to report an unraisable error and stop the serving worker group.

Choosing Ring Sizes

Ring sizing is about queue depth, not payload buffer size. A modest application can start with a small number of in-flight operations; a server usually wants enough entries to cover its expected concurrent I/O without constantly draining and refilling the ring.

Typical starting points:

Use case Suggested entries Notes
Availability probe 2 Enough to prove the kernel will create a ring.
Modest local I/O 8-32 Good for simple tools and initial experiments.
Concurrent client work 64-256 Enough room for batches without large memory pressure.
Server-style I/O 512-4096 Needs deliberate resource-limit checks and backpressure.

For now, uring-api does not register fixed buffers. When those are added, ring entries and registered buffers should be configured separately:

  • ring entries control how many operations can be submitted or completed at once;
  • registered buffers control how much memory the kernel pins for direct I/O or zero-copy style operation;
  • large registered buffer pools can exceed RLIMIT_MEMLOCK even when ring creation itself succeeds.

That distinction matters. During probing, a 64 MiB fixed-buffer pool exceeded a default 64 MiB memlock limit because the limit must cover the pinned payload memory plus kernel/accounting overhead.

You can inspect the process limit before choosing future buffer-pool sizes:

import resource

soft, hard = resource.getrlimit(resource.RLIMIT_MEMLOCK)

print("memlock soft limit:", soft)
print("memlock hard limit:", hard)

For a future registered-buffer API, size the pool explicitly rather than assuming the largest useful value is safe:

buffer_size = 16 * 1024
buffer_count = 256
pool_bytes = buffer_size * buffer_count

print("planned pinned buffer pool:", pool_bytes)

Good default profiles for that future layer would look something like:

Profile Ring entries Buffer size Buffer count Pinned bytes
modest 32 16 KiB 64 1 MiB
interactive 128 16 KiB 256 4 MiB
server 1024 64 KiB 1024 64 MiB

The server profile is intentionally near the common default memlock limit on some systems. In practice, leave headroom or raise the limit before registering that much memory.

Containers and Limits

Containers may block io_uring_setup() even when the host kernel supports it. For example, Docker's default seccomp profile commonly rejects ring creation with EPERM. A less restricted profile may be required for development.

Large future registered-buffer pools may also require raising RLIMIT_MEMLOCK. Prefer smaller buffers while developing the operation model, then make server profiles opt-in and explicit.

Build Requirements

uring-api links against system liburing:

sudo apt install liburing-dev

The native extension requires liburing >= 2.4. Older headers do not expose the version macros we use for build-time validation, and they also predate the data and ring entry helpers used by the extension. On Ubuntu, that means ubuntu-23.10 or newer from distro packages; ubuntu-22.04 needs a newer liburing installed from another source to build _uring_api.

The extension uses multi-phase module initialisation and declares itself safe to import without enabling the GIL on free-threaded CPython builds.

Project details


Download files

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

Source Distribution

uring_api-0.1.0rc0.tar.gz (45.8 kB view details)

Uploaded Source

Built Distributions

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

uring_api-0.1.0rc0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (186.5 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (182.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

uring_api-0.1.0rc0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (156.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (154.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

uring_api-0.1.0rc0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (157.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (155.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

uring_api-0.1.0rc0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (157.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (154.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

uring_api-0.1.0rc0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (153.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (150.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

uring_api-0.1.0rc0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (154.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

uring_api-0.1.0rc0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (150.9 kB view details)

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

File details

Details for the file uring_api-0.1.0rc0.tar.gz.

File metadata

  • Download URL: uring_api-0.1.0rc0.tar.gz
  • Upload date:
  • Size: 45.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for uring_api-0.1.0rc0.tar.gz
Algorithm Hash digest
SHA256 ec2599cecdedd87c60a45bfcc08f55959e692f5822fae98b95dea4d997f040c9
MD5 8c317ce60395cfc44e4aa8076c8b852d
BLAKE2b-256 1c8444eb8c73311c0099b03bc6e5e118137d33d72ad99aad1309ceb56b3c0349

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0.tar.gz:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5b2cc04f4347a834705360c0cee9866d68e6cf72cd0d3d0ec4ac40123bb48688
MD5 a07e8c63db08d327651a021f46ddf756
BLAKE2b-256 7ceb785db8c70f27fd87e08f6b74aacfcece89e262b0e423c56d41971e3cfc01

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 eaa9bf7feb27ead2963c8d3574fc1d31c69513aefc5ed4ccaf5b00549aa9c5ff
MD5 7b535edabccf1a8c3004dcae744e1454
BLAKE2b-256 ac087afed774cbc1bd80f7b5a8d92051d587be70609ae9a43c6dc78f6e621b8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4890e04f35d7f4172a9f7902bf1ced3f0fd13303b098e9dab5584f861c9ece6d
MD5 89beb8f97b3f3040760d012e74037d45
BLAKE2b-256 da5579f1e253c43d6c28e9aad0c6f7c64395922062989a90d65b08e948728405

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 a39ea9192ebd0774ced27dbc5d01981b5dd65bd23375776b4ff2232f38af3e61
MD5 0ad5f99a0efc15d1afb6a8fe731f6d23
BLAKE2b-256 1c576c261ddeb02a8eb2ef5ba13a3e8c48cf3e4bc79eb171fa7875c0d240bbb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9b97da9b1e7306072b65df6b43623fe806f69282607ea29309eced287d3f64ef
MD5 f0b73e85c25d6a6127a05389673d367f
BLAKE2b-256 53bea9a4a2ed45051c50ea4edfd377d7056f19ec16f8e2aca2611eae22770151

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 203f9ce2be8ebf34ff821b6dcc14628eec02978283c6251d2a3a648b949277d4
MD5 3dab9dc85edfd3e534ba586f367e8572
BLAKE2b-256 073043070ee1f840561dd4f799dd572ce6189e1a47b912c5d19296e785013133

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9bd853ad30bc4eccfc1d5912cabff9b54ed48ba62f4fdb94265ace0e7618b1f1
MD5 0fc9d9ef2dcba6eb8dc57a3f01d13d5e
BLAKE2b-256 008a13e41c12cf893ef338af05ecbdbdabed9943e1440ae495079e8d6cb53e78

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 bd3960e1d13019d0ec2852a03591090acc9cca7b293dcb4346339f50ac10098d
MD5 cc90a25beff0966e9b94dff4b4b43791
BLAKE2b-256 03985b0016a335297437c27ead672325923a3c755a707f7dd113fd43a6968184

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3df84721127426566d924cca6b530105d1d4d8a78e99d6d7bf65784942c78c84
MD5 3bc37c84a019e068d45808820198e045
BLAKE2b-256 49043cfcdcd552438841886857a54d301c9f24403d52f124c8ed060f51449161

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 7ff5506280f51cc5482805b235f2e2de38cd37275bcb5aa4d75320d54012f7b0
MD5 239a062a2719d1780380aa46d89f18e3
BLAKE2b-256 97c5b971b6e59c0dd3873cebd8a6318743afb1f44ca75c2fd1482d7793adcfd4

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 67922f78222d5d9db3d0280af13e6819e069acf9d3d95d5639634265392e6ef1
MD5 a7871d6b1cd36fc5b15f210982341570
BLAKE2b-256 87058faac2cb685e7f3064fbe13d55c452cd5da6bd772c1297a10e8beced6cef

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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

File details

Details for the file uring_api-0.1.0rc0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for uring_api-0.1.0rc0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 e004c60ac4bb50abc4a427466bd2be2d83cc9460c12c70b4ae4dd3fea7fe5233
MD5 4d164c77a112a69e9fdcb4e8e46566bd
BLAKE2b-256 f55d69d77a75b5074e9c8154d6d6efc2a05a93183782228a09b306c5125a7f31

See more details on using hashes here.

Provenance

The following attestation bundles were made for uring_api-0.1.0rc0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: uring-api-release-publish.yml on kristjanvalur/pytealet

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 Pingdom Monitoring Sentry Error logging StatusPage Status page