Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
07 Июл 2023
2 мин
1770

Вызов функций из C/C++ в Python

Основная проблема, с которой сталкиваются разработчики, заключается в том, что они хотят использовать библиотеки на C или C++ в своем коде на Python. Это

Основная проблема, с которой сталкиваются разработчики, заключается в том, что они хотят использовать библиотеки на C или C++ в своем коде на Python. Это может быть связано с тем, что эти библиотеки были написаны в прошлом и содержат важные функции, которые разработчик хочет использовать, не переписывая их на Python, или они могут быть более эффективными по производительности, чем аналогичные библиотеки на Python.

Возможно, у вас есть библиотека на C++:

// mylib.cpp
#include <iostream>

extern "C" {
    void hello() {
        std::cout << "Hello, World!" << std::endl;
    }
}

И вы хотите вызвать функцию hello() из этой библиотеки в вашем коде на Python. Как это можно сделать?

1. Использование ctypes

Один из способов — использовать модуль ctypes, который является частью стандартной библиотеки Python. ctypes предоставляет возможность создавать и манипулировать C-совместимыми типами данных в Python, и также вызывать функции в динамических библиотеках/разделяемых библиотеках.

Вот как можно использовать ctypes для вызова функции hello():

from ctypes import cdll

# Загрузка библиотеки
mylib = cdll.LoadLibrary('./mylib.so')

# Вызов функции
mylib.hello()

Обратите внимание, что вам потребуется скомпилировать ваш код C++ в разделяемую библиотеку (mylib.so в Unix-системах или mylib.dll в Windows) перед тем, как вы сможете загрузить его с помощью ctypes.

2. Использование SWIG

SWIG (Simplified Wrapper and Interface Generator) — это другой инструмент, который позволяет вызывать C/C++ код из Python. SWIG генерирует обертки для вызова функций C/C++ из Python.

Вот как можно использовать SWIG:

  1. Напишите интерфейсный файл для SWIG:
// mylib.i
%module mylib

%{
extern void hello();
%}

extern void hello();
  1. Затем вы можете сгенерировать обертку с помощью SWIG:
swig -python mylib.i
  1. Это создаст два файла: mylib_wrap.c и mylib.py. Вы можете скомпилировать mylib_wrap.c в разделяемую библиотеку, а затем использовать mylib.py в вашем коде на Python:
import mylib

mylib.hello()

Это простые способы вызова C/C++ кода из Python, но они могут быть недостаточно гибкими для сложных случаев использования. Для более продвинутых сценариев могут потребоваться другие инструменты, такие как Cython или Boost.Python.

Добавить комментарий

Подарок
Забрать подарок