Знаете ли вы, что вы можете написать функции в 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”