Рубрики
Без рубрики

Как использовать функции C в Python

Знаете ли вы, что вы можете написать функции в C, а затем позвонить им прямо из Python? Разве это не круто? L… Теги с C, Python.

Знаете ли вы, что вы можете написать функции в C, а затем позвонить им прямо из Python? Разве это не круто? Давайте пропустим весь фон и «Почему бы мне когда-либо нужно сделать это» и просто погрузиться в код!

Чтобы продемонстрировать, мы собираемся написать программу в C, чтобы найти факториал номера. Если вы не помните факториалы из средней школы, вот пример:

4! (читать четыре факториала ) * 3 * 2 * 1

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

long factorial(int user_input) {
  long return_val = 1;
  if (user_input <= 0) {
    return -1;
  else {
    for (long i = 1; i <= user_input; i++) {
      return_val *= i;
    }
  }
  return return_val;
}

int main() {
  return 0;
}

Мы определяем функцию, называемую «факториал», которая вернет «долго. ” Мы используем длинные вместо INT, потому что факториальные функции могут вернуть некоторые довольно большие цифры.

Далее мы объявляем и инициализация return_val который мы будем использовать, чтобы вернуть значение расчета.

Теперь Если Заявление обеспечивает, чтобы число, передаваемое пользователем, является положительным, а если нет, чтобы вернуть значение -1. Мы возвращаем -1, потому что позже, когда мы завершим эту функцию в Python, мы узнаем, что получение -1 обратно от функции C, вероятно, означает, что был плохой ввод.

Если номер возвращается больше 0, мы вводим наш цикл, в котором мы используем итератор, Я и умножить наши return_val переменная, пока Я равно числу, переданному пользователю. В основном эта петля говорит: Ней! * 2 * 3 * 4 ... * N

Заключительная часть, с INT MAIN () Чтобы успокоить компилятор C, когда мы превратим это в файл .so. Я могу ошибаться, но я уверен, что эта часть необходима, даже если это ничего не делает. Если кто-то знает лучше, пожалуйста, не стесняйтесь упомянуть так.

Теперь, когда наш C написан, у нас есть пара вещей, прежде чем мы пишете бит Python. Во-первых, сохраните файл .c. Я позвонил мою cfactorial.c Отказ Теперь мы должны превратить это в файл «Общий объект». В Linux команда для этого является это:

$ cc -fPIC -shared -o cfactorial.so cfactorial.c

Эта конкретная команда сделает cfactorial.so Из моего cfactorial.c файл. Теперь, к фактическому питону

Почти готово! Огоньте этот текстовый редактор снова и позвольте сценарию немного Python. Во-первых, нам нужно импортировать CTYPES модуль. Тогда, если вы что-то вроде меня, вы захотите поставить абсолютный путь .Со файл в собственную переменную. Так что вершина моего Pyfactorial.py Похоже:

from ctypes import *

so_file = '/home/ewhiting/cstuff/cfactorial.so'

Следующее, что мы хотим сделать, это создать наш объект CDLL из наших ранее созданных .Со файл. Итак, после переменного назначения SO_FILE, поставьте:

cfactorial = CDLL(so_file)

Теперь, технически на этом этапе вы можете начать возиться с вызова функции C в скрипте Python, запустив Python в командной строке, но давайте сначала становятся немного ответственными. Прежде чем мы играть с ним еще, давайте обернуть нашу C функцию C в функции Python. После создания ЦК Переменная, создать следующую функцию:

def factorial(num):
  c_return = cfactorial.factorial(num)
  if (c_return != -1):
    return c_return
  else:
    return "C Function failed, check inputs"

Сохраните этот файл как pyfactorial.py. В целом, это должно выглядеть так:

from ctypes import *

so_file = '/home/ewhiting/cstuff/cfactorial.so'
cfactorial = CDLL(so_file)

def factorial(num):
  c_return = cfactorial.factorial(num)
  if (c_return != -1):
    return c_return
  else:
    return "C Function failed, check inputs"

ПРИМЕЧАНИЕ, способ вызовов функций внутри импортированного файла объекта C, который говорил <Объект CDLL>. <Имя функции из C-кода> (<параметр>) Отказ Легко!

Таким образом, в принципе, в любое время, когда мы хотим использовать это функцию C в Python, мы называем факториал Функция, которая запускает функцию C с параметром, переданным пользователем и оценивая результат. Если функция C возвращает -1 (помните, что мы поставили туда), сценарий Python знает, что возникла проблема. В противном случае это вернет номер. Давайте попробуем! Выгоните свой терминал и начните питон

>>> import pyfactorial as pf
>>> pf.factorial(5)
120
>>> pf.factorial(10)
3628800
>>> pf.factorial(-4)
'C Function failed, check inputs'

Та-да !! Это основная идея позади функций C в Python. Это, безусловно, стоит иметь возможность иметь. Примените все свои другие знания программирования, чтобы сделать потрясающие функции и функции, и дайте мне знать, если у вас есть какие-либо вопросы.

Оригинал: “https://dev.to/erikwhiting88/how-to-use-c-functions-in-python-7do”