PyAwaitable
Call asynchronous code from an extension module
What is it?
PyAwaitable is the only library to support writing and calling asynchronous Python functions from pure C code (with the exception of manually implementing an awaitable class from scratch, which is essentially what PyAwaitable does).
It was originally designed to be directly part of CPython - you can read the scrapped PEP about it. Since this library only uses the public ABI, it's better fit outside of CPython, as a library.
Installation
Add it to your project's build process:
[build-system]
requires = ["setuptools", "pyawaitable"]
build-backend = "setuptools.build_meta"
[project]
dependencies = ["pyawaitable"]
Include it in your extension:
from setuptools import setup, Extension
import pyawaitable
if __name__ == "__main__":
setup(
...,
ext_modules=[Extension(..., include_dirs=[pyawaitable.include()])]
)
Example
#include <pyawaitable.h>
static PyObject *
hello(PyObject *self, PyObject *coro) {
PyObject *awaitable = pyawaitable_new();
if (!awaitable)
return NULL;
if (pyawaitable_await(awaitable, coro, NULL, NULL) < 0) {
Py_DECREF(awaitable);
return NULL;
}
return awaitable;
}
async def coro():
await asyncio.sleep(1)
print("awaited from C!")
await hello(coro())
Copyright
pyawaitable
is distributed under the terms of the MIT license.