Python và mô-đun `ctypes`: Gọi và tích hợp mã nguồn tự nhiên

Python là một ngôn ngữ lập trình cấp cao, nhưng thông qua việc sử dụng mô-đun ctypes, chúng ta có thể gọi mã nguồn C nguyên bản từ Python. Bài viết này sẽ giải thích chi tiết từ cách sử dụng cơ bản của ctypes đến các chủ đề nâng cao.

ctypes là gì?

Mô-đun ctypes của Python là một bọc cho việc sử dụng thư viện chia sẻ hoặc thư viện liên kết động (DLL) được viết bằng ngôn ngữ C từ Python. Thông qua điều này, mã nguồn Python có thể tương tác với mã nguồn C nguyên bản và đạt được hiệu suất và chức năng cao cấp.

Cách sử dụng cơ bản của ctypes

1. Tải thư viện

Đầu tiên, chúng ta hãy xem cách sử dụng ctypes để tải thư viện C vào Python.

from ctypes import CDLL

# Tải thư viện chia sẻ
my_library = CDLL('./my_library.so')  # Chỉ định đường dẫn thư viện

2. Gọi hàm

Tiếp theo, là cách gọi các hàm trong thư viện đã tải.

# Gọi hàm trong thư viện C
result = my_library.my_function(arg1, arg2)
print(result)

Thao tác với cấu trúc và con trỏ

Sử dụng ctypes, chúng ta có thể thao tác với cấu trúc và con trỏ được định nghĩa trong ngôn ngữ C.

1. Định nghĩa cấu trúc

from ctypes import Structure, c_int, c_char_p

class MyStruct(Structure):
    _fields_ = [
        ('field1', c_int),
        ('field2', c_char_p),
    ]

2. Thao tác với con trỏ

# Tạo con trỏ
my_pointer = POINTER(MyStruct)()

# Truy cập cấu trúc thông qua con trỏ
my_pointer.contents.field1 = 42
my_pointer.contents.field2 = b'Xin chào, ctypes!'

Chủ đề Nâng cao: Xử lý hàm gọi lại

Sử dụng ctypes, chúng ta cũng có thể gọi hàm gọi lại được định nghĩa trong mã nguồn C từ Python.

from ctypes import CFUNCTYPE

# Định nghĩa hàm gọi lại được sử dụng trong mã nguồn C
callback_func_type = CFUNCTYPE(c_int, c_int, c_int)

def my_callback(arg1, arg2):
    print(f'Gọi lại với các tham số: {arg1}, {arg2}')
    return arg1 + arg2

# Chuyển đổi hàm Python thành hàm gọi lại
callback_func = callback_func_type(my_callback)

Tổng kết

Bài viết này đã giới thiệu từ cách sử dụng cơ bản của mô-đun ctypes đến thao tác với cấu trúc và con trỏ, cũng như xử lý hàm gọi lại. Thông qua các phương pháp này, lập trình viên Python có thể sử dụng mã nguồn C hiện có trong khi đạt được hiệu suất và chức năng cải thiện.