Python:ctypes
lastmod 2024-09-23created 2016-10-2410 edits
CDLL Example
import ctypes
libc = ctypes.CDLL(None)
c_stdout = ctypes.c_void_p.in_dll(libc, 'stdout') # stdout 획득 방법.
libc.puts(b'this comes from C') # puts 호출 방법.
Refactoring
Example from the dmtx_library.py file of pylibdmtx:
"""Loads libdmtx.
"""
import platform
import sys
from ctypes import cdll
from ctypes.util import find_library
from pathlib import Path
__all__ = ['load']
def _windows_fname():
"""For convenience during development and to aid debugging, the DLL name is
specific to the bit depth of interpreter.
This logic has its own function to make testing easier
"""
return 'libdmtx-64.dll' if sys.maxsize > 2**32 else 'libdmtx-32.dll'
def load():
"""Loads the libdmtx shared library.
"""
if 'Windows' == platform.system():
# Possible scenarios here
# 1. Run from source, DLLs are in pylibdmtx directory
# cdll.LoadLibrary() imports DLLs in repo root directory
# 2. Wheel install into CPython installation
# cdll.LoadLibrary() imports DLLs in package directory
# 3. Wheel install into virtualenv
# cdll.LoadLibrary() imports DLLs in package directory
# 4. Frozen
# cdll.LoadLibrary() imports DLLs alongside executable
fname = _windows_fname()
try:
libdmtx = cdll.LoadLibrary(fname)
except OSError:
libdmtx = cdll.LoadLibrary(
str(Path(__file__).parent.joinpath(fname))
)
else:
# Assume a shared library on the path
path = find_library('dmtx')
if not path:
raise ImportError('Unable to find dmtx shared library')
libdmtx = cdll.LoadLibrary(path)
return libdmtx
c_void_p
A C NULL pointer can be created with ctypes.c_void_p(0).
memmove Example
Use addressof to get a C pointer address; its argument must be an instance of a ctypes type.
For a ctypes type instance of a plain Python bytes object, use create_string_buffer.
from ctypes import addressof, create_string_buffer, memmove
pixels = ...
size = width * height * channels
assert isinstance(pixels, bytes)
assert isinstance(size, int)
buffer_ptr = GL.glMapBuffer(GL.GL_PIXEL_UNPACK_BUFFER, GL.GL_WRITE_ONLY)
if buffer_ptr:
pixels_ptr = addressof(create_string_buffer(pixels, size))
memmove(buffer_ptr, pixels_ptr, size)
GL.glUnmapBuffer(GL.GL_PIXEL_UNPACK_BUFFER)
See also
Favorite site
- DLL loading and using ctypes in Python (2.7.10)
- Using C modules in Python
- Using functions from a C/C++ dll in Python (feat. ctypes)
- Python FFI with ctypes and cffi - Python Snippets - collection of Python code snippets
Pages that link here