Cee EXtensions Interpolation
Project description
Cee EXtensions Interpolation
Rationale
cexi aims to facilitate developing of C extension for CPython. In particular interfacing between python and C. In general building C extensions is a tedious process, especially when it comes to interfacing between two languages. cexi aims to make it easier by providing a simple interface to write C extensions in a pythonic way. It's not a replacement for Cython, CFFI, SWIG, Boost.Python or PyBind11, but rather a tool to make writing C extensions easier. It's main features are:
- pythonic interface to write C extensions
- automatic re/compilation of C extensions
- automatic loading of C extensions
Code example
from cexi import Module, s
class Foo(Module):
class options:
flags = ['-O3']
"""
#include "stdio.h"
"""
@s.cee
def foo(x: int) -> int:
"""
return x + 1;
"""
@s.share
def bar(self, x: int) -> int:
return x ** 2
@s.py
def baz(x: int, y: int) -> (int, int):
"""
printf("baz\\n");
int ret = x + y;
bar(ret, &ret);
return(foo(x + y), ret);
"""
def wrapped_baz(self, x, y):
print(f'calling {self.baz}')
return self.baz(x, y)
Foo().foo(1) # => 2
ret = Foo().wrapped_baz(3, 4) # => prints
# calling <cexi.proxy.Proxy object at 0x7f4bae56cf10>
# baz
print(ret) # => prints (8, 49)
class Foo(Module, near=__file__):
pass
class Foo(Module):
directory = Path('/some/path')
Breakdown
Each extension begins with a class definition that inherits from cexi.Module. User can define flags
that will be passed to compiler via options class attribute.
class Foo(Module):
class options:
flags = ['-O3']
Module docstring is directly inserted at the beginning of cee extension. It's useful to include headers that will be used in extension's code.
class Foo(Module):
"""
#include "stdio.h"
"""
Then user can define functions that will be compiled as extension's functions. There are three types of functions:
@s.cee- plain cee function, it's useful to organize plain cee routines..ceefunctions aren't available for use in python, they're simply excluded from final class namespace@s.share- .share is a plain python function that is added to module to be used in cee code it's signature is transformed as such:func([input parameters]) -> <output parameters>=>int func([input parameters], [pointers to output parameters])e.g. bar here becomesint bar(int x, int *a), it returns non-zero value on failure & modify pointer to the return value@s.py- .py is a cee extension function. it's available from python & can use both .cee & .share functions at will Untagged functions are left untouched, i.e. they're just instance's methods. cexi.Module children act as singletones - on instantiation they're get loaded/compiled by default they are built inside temporaty directories, but users are able to make modules persistent. There are two ways to do it:nearparameter - if it's set to__file__module will be built in directory at__file__/../<module name>_cexi_moduledirectoryclass attribute - if it's set module will be built in specified directory
Persistent extensions compiled on-demand. If extension is persistent cexi first loads it's module. Then it compares revisions, which are hashed module's contents. Thus if class definition is changed since last compilation it will be re-compiled and re-loaded.
You can also compile persistent extensions with command
python -mcexi <module path>:<class name>
Installation
pip install cexi
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cexi-0.0.3.tar.gz.
File metadata
- Download URL: cexi-0.0.3.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32ead3ed73683db7b446db94c085e5ff3aad55d3f77417fbc688562dfd8ac53c
|
|
| MD5 |
3486a73456782341f2144e40c9186fd0
|
|
| BLAKE2b-256 |
f6be92718cf196924e68fb38f6d99aa412bd2991c12a02a2077ff1900d28d041
|
File details
Details for the file cexi-0.0.3-py3-none-any.whl.
File metadata
- Download URL: cexi-0.0.3-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4840e129a39761d3f400a1ef25eb9949c357bf6d0695a66461403225406256d
|
|
| MD5 |
9d08e3412f07dd4d0285e86a9fa9945b
|
|
| BLAKE2b-256 |
992404a6d8cacaf7a9b497a9978dd8a97dda4f83490695a9750d2ad0e1f8f061
|