Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
CALL	A	C	API	FROM	PYTHON
BECOMES	MORE	ENJOYABLE	WITH
CFFI
JEAN-SÉBASTIEN	BEVILACQUA
/ME
twitter/@realitix
github.com/realitix
realitix.github.io
WHY	PYTHON
EXTENSION	?
WHY	PYTHON
EXTENSION	?
ACCESSING	LOW-LEVEL	API	
OPENGL	/	VULKAN

WHY	PYTHON
EXTENSION	?
LINKING	TO	EXISTING	C	LIBRARY	

WHY	PYTHON
EXTENSION	?
IMPROVING	PERFORMANCE	

OUR	GOOD	FRIEND	IS
ALWAYS	HERE	!
I'M	TOTALLY	LOST	
WITH	
CPYTHON	API
APPLICATION	PROGRAMMING
INTERFACE
APPLICATION	BINARY	INTERFACE

WHY	ABI	?
CYTHON
CYTHON
INCREMENTAL	OPTIMIZATION	
PY++
CYTHON
def	fib(int	n):
				cdef	int	a	=	0
				cdef	int	b	=		1
				while	b	<	n:
								print(b)
								a,	b	=	b,	a	+	b
		...
CYTHON
ABI	/	API
CTYPES
BUILT-IN	/	ABI	ONLY
CTYPES
from	ctypes	import	cdll,	Structure,	c_int,	c_double
lib	=	cdll.LoadLibrary('./vector.so')
#	ctypes	Point	structure
...
CFFI	ENLIGHTENED
IN-LINE	:	IMPORT	TIME
OUT-OF-LINE	:	INSTALL	TIME
ABI	/	IN-LINE
from	cffi	import	FFI
ffi	=	FFI()
ffi.cdef("int	printf(const	char	*format,	...);")
C	=	ffi.dlopen(None)
arg	=...
ABI	/	IN-LINE
DEMO
API	/	OUT-OF-LINE
from	cffi	import	FFI
ffibuilder	=	FFI()
ffibuilder.set_source("_example",
			r"""#include	<sys/types.h>
...
API	/	OUT-OF-LINE
RUNNING
REBUILD
STATISTICS
VULKAN	API
C	HEADER	:	5088	LOC
XML	DESCRIPTION	:	6461	LOC
STATISTICS
C	WRAPPER
GENERATED	C	FILE	:	62705	LOC
GENERATOR	:	1057	PY-LOC	/	1141	C-LOC
STATISTICS
CFFI	WRAPPER
GENERATED	PYTHON	FILE	:	4859
LOC
GENERATOR	:	692	PY-LOC
HOW	IT	WORKS	?
JINJA2	TEMPLATE
JINJA2	TEMPLATEC	EXTENSION
├──	converters.c	->	423
├──	custom_functions.c	->	103
├──	custom_structs.c	->	59
├──	extension_...
JINJA2	TEMPLATE
CFFI	EXTENSION
ONLY	ONE	SMALL	FILE
vulkan.template.py	->	340
SHOW	ME	THE	CODE	!
CONSTANTS
C	EXTENSION
CFFI	EXTENSION
PyModule_AddIntConstant(module,	{{name}},	{{value}});
{{name}}	=	{{value}}
OBJECTS
OBJECTS
C	EXTENSION
NEW	(MALLOC)
DEL	(FREE)
INIT
GET	(FOR	EACH	MEMBER)
OBJECTS
CFFI	EXTENSION
def	_new(ctype,	**kwargs):
				_type	=	ffi.typeof(ctype)
				ptrs	=	{}
				for	k,	v	in	kwargs.items...
FAST	API	MODE
SHADERC	WRAPPER
FOLDER	DESIGN
├──	_cffi_build
│			├──	pyshaderc_build.py
│			└──	shaderc.h
├──	pyshaderc
│			└──	__init__.py
└──	setup.py
DEFINITION
ffi	=	FFI()
with	open('shaderc.h')	as	f:
				ffi.cdef(f.read())
BUILDING
ffi	=	FFI()
with	open('shaderc.h')	as	f:
				source	=	f.read()
ffi.set_source('_pyshaderc',	source,	libraries=['s...
USE
USE
from	pyshaderc._pyshaderc	import	ffi,	lib
USE
def	compile_into_spirv(raw,	stage,	suppress_warnings=False):
				#	initialize	compiler
				compiler	=	lib.shaderc_comp...
USE
				length	=	lib.shaderc_result_get_length(result)
				output_pointer	=	lib.shaderc_result_get_bytes(result)
				tmp	=...
SETUPTOOLS
INTEGRATION
setup(
				...
				cffi_modules=["_cffi_build/pyshaderc_build.py:ffi"]
)
DEMO	TIME	!
SPECIAL	GUEST
ARMIN	RIGO	
MACIEJ	FIJAŁKOWSKI
GIVE	A	TRY	TO	CFFI	!
@REALITIX
LINAGORA.COM
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
What to Upload to SlideShare
Next
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

0

Share

Call a C API from Python becomes more enjoyable with CFFI

Download to read offline

Our collaborator Jean Sebastien talked about CFFI, a Python module to interface with C library at EuropPtython 2017

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Call a C API from Python becomes more enjoyable with CFFI

  1. 1. CALL A C API FROM PYTHON BECOMES MORE ENJOYABLE WITH CFFI JEAN-SÉBASTIEN BEVILACQUA
  2. 2. /ME twitter/@realitix github.com/realitix realitix.github.io
  3. 3. WHY PYTHON EXTENSION ?
  4. 4. WHY PYTHON EXTENSION ? ACCESSING LOW-LEVEL API OPENGL / VULKAN 
  5. 5. WHY PYTHON EXTENSION ? LINKING TO EXISTING C LIBRARY 
  6. 6. WHY PYTHON EXTENSION ? IMPROVING PERFORMANCE 
  7. 7. OUR GOOD FRIEND IS ALWAYS HERE !
  8. 8. I'M TOTALLY LOST WITH CPYTHON API
  9. 9. APPLICATION PROGRAMMING INTERFACE APPLICATION BINARY INTERFACE 
  10. 10. WHY ABI ?
  11. 11. CYTHON
  12. 12. CYTHON INCREMENTAL OPTIMIZATION PY++
  13. 13. CYTHON def fib(int n): cdef int a = 0 cdef int b = 1 while b < n: print(b) a, b = b, a + b
  14. 14. CYTHON ABI / API
  15. 15. CTYPES BUILT-IN / ABI ONLY
  16. 16. CTYPES from ctypes import cdll, Structure, c_int, c_double lib = cdll.LoadLibrary('./vector.so') # ctypes Point structure class Point(Structure): _fields_ = [('x', c_int), ('y', c_int)] # Initialize Point[2] argument points_array = (Point * 2)((1, 2), (3, 4)) # Get vector_size from library vector_size_fn = lib.vector_size vector_size_fn.restype = c_double # Call vector_size with ctypes size = vector_size_fn(points_array) print('out = {}'.format(size))
  17. 17. CFFI ENLIGHTENED IN-LINE : IMPORT TIME OUT-OF-LINE : INSTALL TIME
  18. 18. ABI / IN-LINE from cffi import FFI ffi = FFI() ffi.cdef("int printf(const char *format, ...);") C = ffi.dlopen(None) arg = ffi.new("char[]", "world") C.printf("hello %sn", arg)
  19. 19. ABI / IN-LINE DEMO
  20. 20. API / OUT-OF-LINE from cffi import FFI ffibuilder = FFI() ffibuilder.set_source("_example", r"""#include <sys/types.h> #include <pwd.h> """) ffibuilder.cdef(""" struct passwd { char *pw_name; ...; }; struct passwd *getpwuid(int uid); """) if __name__ == "__main__": ffibuilder.compile(verbose=True)
  21. 21. API / OUT-OF-LINE RUNNING
  22. 22. REBUILD
  23. 23. STATISTICS VULKAN API C HEADER : 5088 LOC XML DESCRIPTION : 6461 LOC
  24. 24. STATISTICS C WRAPPER GENERATED C FILE : 62705 LOC GENERATOR : 1057 PY-LOC / 1141 C-LOC
  25. 25. STATISTICS CFFI WRAPPER GENERATED PYTHON FILE : 4859 LOC GENERATOR : 692 PY-LOC
  26. 26. HOW IT WORKS ?
  27. 27. JINJA2 TEMPLATE
  28. 28. JINJA2 TEMPLATEC EXTENSION ├── converters.c -> 423 ├── custom_functions.c -> 103 ├── custom_structs.c -> 59 ├── extension_functions.c -> 32 ├── functions.c -> 8 ├── header.c -> 11 ├── init.c -> 68 ├── init_unions │ ├── vkclearcolorvalue.c -> 69 │ └── vkclearvalue.c -> 36 ├── macros.c -> 111 ├── main.c -> 122 ├── objects.c -> 99 └── jfilter.py -> 542 Total: 1683
  29. 29. JINJA2 TEMPLATE CFFI EXTENSION ONLY ONE SMALL FILE vulkan.template.py -> 340
  30. 30. SHOW ME THE CODE !
  31. 31. CONSTANTS C EXTENSION CFFI EXTENSION PyModule_AddIntConstant(module, {{name}}, {{value}}); {{name}} = {{value}}
  32. 32. OBJECTS
  33. 33. OBJECTS C EXTENSION NEW (MALLOC) DEL (FREE) INIT GET (FOR EACH MEMBER)
  34. 34. OBJECTS CFFI EXTENSION def _new(ctype, **kwargs): _type = ffi.typeof(ctype) ptrs = {} for k, v in kwargs.items(): # convert tuple pair to dict ktype = dict(_type.fields)[k].type if ktype.kind == 'pointer': ptrs[k] = _cast_ptr(v, ktype) init = dict(kwargs, **{k: v for k, (v, _) in ptrs.items()}) return ffi.new(_type.cname + '*', init)[0]
  35. 35. FAST API MODE
  36. 36. SHADERC WRAPPER
  37. 37. FOLDER DESIGN ├── _cffi_build │ ├── pyshaderc_build.py │ └── shaderc.h ├── pyshaderc │ └── __init__.py └── setup.py
  38. 38. DEFINITION ffi = FFI() with open('shaderc.h') as f: ffi.cdef(f.read())
  39. 39. BUILDING ffi = FFI() with open('shaderc.h') as f: source = f.read() ffi.set_source('_pyshaderc', source, libraries=['shaderc_combined']) if __name__ == '__main__': ffi.compile()
  40. 40. USE
  41. 41. USE from pyshaderc._pyshaderc import ffi, lib
  42. 42. USE def compile_into_spirv(raw, stage, suppress_warnings=False): # initialize compiler compiler = lib.shaderc_compiler_initialize() # compile result = lib.shaderc_compile_into_spv(compiler, raw, len(raw), stage, b"main")
  43. 43. USE length = lib.shaderc_result_get_length(result) output_pointer = lib.shaderc_result_get_bytes(result) tmp = bytearray(length) ffi.memmove(tmp, output_pointer, length) spirv = bytes(tmp) return spirv
  44. 44. SETUPTOOLS INTEGRATION setup( ... cffi_modules=["_cffi_build/pyshaderc_build.py:ffi"] )
  45. 45. DEMO TIME !
  46. 46. SPECIAL GUEST ARMIN RIGO MACIEJ FIJAŁKOWSKI
  47. 47. GIVE A TRY TO CFFI ! @REALITIX LINAGORA.COM

Our collaborator Jean Sebastien talked about CFFI, a Python module to interface with C library at EuropPtython 2017

Views

Total views

1,003

On Slideshare

0

From embeds

0

Number of embeds

1

Actions

Downloads

10

Shares

0

Comments

0

Likes

0

×