Calling C/C from Python
When working with Windows systems, efficiently binding Python to C/C libraries is crucial. Among the available options, the ctypes module stands out as a compelling choice.
Utilizing Ctypes for Bindings
Ctypes is an integral part of Python's standard library. This inherent stability and broad availability make it an advantageous option compared to other alternatives. Moreover, ctypes bindings are tailored to work seamlessly with every version of Python that supports ctypes, not just the one used during compilation.
Constructing a Python Binding with Ctypes
Consider a simplified C class named Foo defined in foo.cpp:
#include <iostream> class Foo{ public: void bar(){ std::cout << "Hello" << std::endl; } };
To facilitate communication with Python via ctypes, its functions must be declared as extern "C":
extern "C" { Foo* Foo_new(){ return new Foo(); } void Foo_bar(Foo* foo){ foo->bar(); } }
Next, compile this code into a shared library:
g++ -c -fPIC foo.cpp -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
Finally, create a Python wrapper (e.g., fooWrapper.py):
from ctypes import cdll lib = cdll.LoadLibrary('./libfoo.so') class Foo(object): def __init__(self): self.obj = lib.Foo_new() def bar(self): lib.Foo_bar(self.obj)
With this wrapper, you can interact with the C class:
f = Foo() f.bar() # Outputs "Hello" to the screen
Benefits of Ctypes
Ctypes simplifies the process of binding C/C code to Python, providing a stable and widely applicable solution on Windows systems. It offers a robust and cross-compatible approach for interfacing with native libraries from Python.
The above is the detailed content of How Can Ctypes Efficiently Bridge Python and C/C on Windows?. For more information, please follow other related articles on the PHP Chinese website!