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.

C Types - Extending Python

33,857 views

Published on

Extending Python was never easier!

Published in: Technology
  • Hello! I have searched hard to find a reliable and best research paper writing service and finally i got a good option for my needs as ⇒ www.HelpWriting.net ⇐
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • panels searching for survey takers! ●●● https://t.cn/A6ybK1ra
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/36cXjBY ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❶❶❶ http://bit.ly/36cXjBY ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THAT BOOKS INTO AVAILABLE FORMAT (2019 Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book that can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer that is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBooks .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story That Helped Ignite a Movement,-- Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money That the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths that Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

C Types - Extending Python

  1. 1. ctypes <ul><li>extending python was never easier! </li></ul><ul><li>Anant Narayanan </li></ul><ul><li>Malaviya National Institute of Technology </li></ul>C !
  2. 2. So what is python? <ul><li>Dynamically typed, interpreted language </li></ul><ul><li>Allows for fast prototyping, thanks to the awesome interpreter </li></ul><ul><li>The interpreter revolutionized how programmers attacked problems </li></ul><ul><li>Emphasizes simplicity </li></ul>
  3. 3. How does python work? <ul><li>Classic implementation written in the C language, also known as CPython </li></ul><ul><li>Provides an API to communicate between “C-Land” and “Python-Land” </li></ul><ul><li>Standard functions to convert C data types to python types and vice-versa </li></ul>
  4. 4. Python Fundamentals <ul><li>Simple set of data types </li></ul><ul><li>string , int / long , float and unicode </li></ul><ul><li>Every function, class or data type is an object </li></ul><ul><li>These objects are, in reality, wrappers over corresponding C types </li></ul><ul><li>Basic python functions implemented in C, higher level functions in python itself </li></ul>
  5. 5. C fundamentals <ul><li>Rich set of data types, including the infamous pointers! </li></ul><ul><ul><li>Basic types: int, char, double, float, w_char_t </li></ul></ul><ul><ul><li>Arrays: char*, w_char_t*, int* </li></ul></ul><ul><ul><li>Structures and Unions </li></ul></ul>
  6. 6. The need for bindings <ul><li>The python standard library provides a lot of useful functionality </li></ul><ul><li>However, python’s success is mainly attributed to the availability of bindings to many popular libraries </li></ul><ul><li>Gtk+, wxWidgets, openGL, SDL, cdrecord, Gnome etc... </li></ul>
  7. 7. The “good old” way <ul><li>use functions defined by “Python.h” to export objects: </li></ul><ul><ul><li>PyObject *obj </li></ul></ul><ul><ul><li>PyArg_ParseTuple </li></ul></ul><ul><ul><li>Py_BuildValue </li></ul></ul><ul><ul><li>Py_INCREF, Py_DECREF </li></ul></ul><ul><ul><li>PyModule_AddObject, Py_InitModule </li></ul></ul>
  8. 8. The “good old” way <ul><li>Good for simple libraries </li></ul><ul><li>Tends to be very monotonous </li></ul><ul><li>pyGTK uses code-generation instead </li></ul><ul><li>Converts function prototypes found in C Header files to scheme-like `def' files, which are then parsed to generated Python Module code </li></ul>
  9. 9. SWIG: The Next Step <ul><li>Abstracts code-generation </li></ul><ul><li>Single “interface” file defines function prototypes, which is then converted to appropriate C binding code </li></ul><ul><li>Not only generates code for python, but PHP, Perl, Ruby and Java too </li></ul><ul><li>Used by Subversion and other major projects </li></ul>
  10. 10. What’s wrong with SWIG? <ul><li>Need to learn the swig “interface” language </li></ul><ul><li>Produces computer-generated code </li></ul><ul><ul><li>Ugly to read! </li></ul></ul><ul><ul><li>Impossible to debug! </li></ul></ul><ul><li>Additional dependency and build routine </li></ul>
  11. 11. Enter ctypes! <ul><li>An even higher layer of abstraction </li></ul><ul><li>Code generation done at memory level </li></ul><ul><li>Allows dynamic execution of functions in a shared library </li></ul><ul><li>.dll, .so and .dylib supported </li></ul>
  12. 12. What does this mean? <ul><li>extend python with functions from C libraries - easy bindings written in pure python </li></ul><ul><li>write your callback functions in python and call them from C </li></ul><ul><li>use python as a true “glue” language: interconnecting several libraries to create large, coherent programs </li></ul>
  13. 13. How does it work? import ctypes import your library prepare parameters call the (next) function
  14. 14. Searching for libraries <ul><li>ctypes.util.find_library </li></ul><ul><ul><li>Runs ` ldconfig `, ` gcc ` and ` objdump ` </li></ul></ul><ul><ul><li>Returns filename of the library </li></ul></ul><ul><ul><li>OS X: Standard paths are looked in; absolute path of dylib returned </li></ul></ul>
  15. 15. Importing libraries <ul><li>ctypes.CDLL (name, mode, handle) </li></ul><ul><ul><li>Represents a loaded shared library </li></ul></ul><ul><ul><li>Functions in these libraries are called using the standard calling convention of C </li></ul></ul><ul><ul><li>Functions are assumed to return int </li></ul></ul><ul><li>ctypes.PyDLL (name, mode, handle) </li></ul><ul><ul><li>Python GIL is not released, hence exceptions are caught and returned. Useful for using the python C API itself! </li></ul></ul>
  16. 16. Importing libraries <ul><li>preset library loaders available (just call cdll) </li></ul><ul><li>Or manually load with LibraryLoader and LoadLibrary </li></ul><ul><li>pythonapi represents an instance of PyDLL with the CPython API loaded </li></ul><ul><li>Also available: windll, oledll </li></ul>
  17. 17. Accessing functions <ul><li>All functions are exported as attributes of the CDLL/PyDLL class </li></ul><ul><li>Functions are objects of type _FuncPtr </li></ul><ul><li>Called just like regular python callables </li></ul><ul><li>But remember to first convert the parameters! </li></ul>
  18. 18. Type conversion <ul><li>int/long, None, strings and unicode objects are automatically converted for you! </li></ul><ul><li>any types other than these must first be converted using the data types provided by ctypes </li></ul><ul><li>python type ctype C data type </li></ul>
  19. 19. Some common ctypes <ul><li>Mutable </li></ul><ul><ul><li>c_char, c_wchar, c_byte, c_ubyte </li></ul></ul><ul><ul><li>c_short, c_ushort </li></ul></ul><ul><ul><li>c_int, c_uint, c_long, c_ulong, c_float, c_double </li></ul></ul><ul><li>Immutable </li></ul><ul><ul><li>c_char_p, c_wchar_p, c_void_p </li></ul></ul>
  20. 20. Mutability for strings <ul><li>st = “Hello World!” nt = c_char_p(st) print nt # returns c_char_p(“Hello World!”) nt.value = “Bye Bye World!” print nt # returns c_char_p(“Bye Bye World!”) print st # returns “Hello World!” </li></ul><ul><li>Use </li></ul><ul><ul><li>create_string_buffer(<bytes>) </li></ul></ul><ul><ul><li>create_string_buffer(<string>) </li></ul></ul>
  21. 21. Specifying parameter types <ul><li>Set the argtypes attribute for the function object </li></ul><ul><li>This attribute is a sequence of ctypes: </li></ul><ul><ul><li>myfunc.argtypes = [c_char_p, c_int, c_double] </li></ul></ul><ul><li>Setting this attribute will ensure that function is called with the correct number and types of attributes, and will also convert where possible </li></ul>
  22. 22. Specifying return types <ul><li>Set the restype attribute for the function object </li></ul><ul><li>This attribute corresponds to any valid ctype </li></ul><ul><li>Also possible to set it as a python callable if the actual return type is an integer </li></ul><ul><li>In this case, the callable will be invoked with the actual result; and the result of the callable will appear to be the result of the function instead </li></ul>
  23. 23. Using Pointers <ul><li>Use the quick and easy byref function </li></ul><ul><li>Or construct a proper pointer ctype </li></ul><ul><ul><li>Value can be accessed by the contents attribute, and also by offset </li></ul></ul><ul><li>Use byref when you don't need the pointer object later on </li></ul>
  24. 24. Structures & Unions <ul><li>All structures are defined as children of the structure base class </li></ul><ul><li>The _fields_ attribute is a list of 2-tuples, containing a field name and a field type </li></ul><ul><li>The field name is any valid python identifier and the field type is any valid ctype. </li></ul>
  25. 25. Structures & Unions <ul><li>Similarly Unions are extended from the union base class </li></ul><ul><li>Both are initialized by creating an instance of the class </li></ul><ul><li>Bit fields are also possible </li></ul><ul><ul><li>Pass the bit-length of the field as the 3 rd tuple of each list in the _fields_ attribute </li></ul></ul>
  26. 26. Forward declarations <ul><li>The _fields_ attribute can't contain elements that haven't been declared </li></ul><ul><li>However, you can always define or add to the _fields_ attribute later! </li></ul><ul><li>Be careful of using your structure before you have finalized your _fields_, this could lead to inconsistencies </li></ul>
  27. 27. Arrays <ul><li>Simply multiply the base element type with a positive integer! </li></ul><ul><ul><li>myArray = (c_int * 5)(, 2, 3, 4, 5) for i in range(5): print myArray[i] </li></ul></ul><ul><li>...Or create and object that represent your array and instantiate it </li></ul><ul><li>Arrays are proper ctypes, so you can include them in your structures and other complex types </li></ul>
  28. 28. Typecasting <ul><li>ctypes will automatically accept arrays of a base type, where it was expecting just the base type </li></ul><ul><li>In all other cases: strict type checking! </li></ul><ul><li>Use the cast function to typecast one type to another </li></ul><ul><ul><li>obj = (c_byte * 10)() castedObj = cast(obj, POINTER(c_int)) </li></ul></ul>
  29. 29. Callbacks <ul><li>Function pointers are of the CFUNCTYPE and can be created by instantiating that class </li></ul><ul><li>The result type is the first argument, followed by the arguments that your callback function must expect </li></ul><ul><li>Connect the function pointer to the actual python callback by instantiating the object returned by CFUNCTYPE </li></ul>
  30. 30. What now? <ul><li>Clearly, wrapping libraries in ctypes is far easier, and more maintainable </li></ul><ul><li>Not much performance loss (code generation at runtime) </li></ul><ul><li>Most projects now switching to ctypes bindings, you can help! </li></ul>
  31. 31. Thank You! <ul><li>Questions? </li></ul><ul><li>Slides and code samples will be posted at: http://www.kix.in/ctypes/ </li></ul><ul><li>[email_address] </li></ul><ul><li>KillerX on #linux-india - irc.freenode.net </li></ul>

×