Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
07 Июл 2023
2 мин
2012

Вызов функций из 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.

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