Портируем код C/C++ на Python
В этой статье попробуем разобраться, какие еще есть подходы для работы с языками С/С++ и их аналогами, и также рассмотрим возможность анализа С/С++ исходников языков программирования и их компиляции налету. К тому же ответим на вопрос, а можно ли сделать интеграцию C/C++ в языке программирования Python прямо в скрипте. Подобный подход очень размоет границы между языками программирования, но это очень интересный функционал, который возможно может быть полезным.
или Зарегистрируйся, то есть это полноценный парсер языка программирования C и еще несколько дополнительных функций. Как это работает? Библиотека позволяет определять прототипы функций и производить их компиляцию. После проведения этих операций из Python можно вызывать функцию C, как будто она была определена изначально на Python.
Чтобы можно было использовать библиотеку, достаточно ввести вот такую команду:
Для примера того, как можно работать с этой библиотекой, проведем уже известный из предыдущей статьи эксперимент. Попробуем вызвать MessageBoxA из системной библиотеки. Вот так будет выглядеть код:
Результат выполнения скрипта будет таким:
Код стал проще и лаконичнее, теперь можно просто определять функции, копируя их из документации. Все типы, перечисления больше не нужно определять самостоятельно: всё это добавлено уже самой cffi. Но если очень хочется, то можно сделать это вручную. В коде ниже представлен пример того, как можно с помощью библиотеки cffi сделать структуру и присвоить значения её полям:
Все работает так же, как если бы мы просто создавали кусочки быстрого и эффективного кода на С. А что же насчет С++? К сожалению, эта библиотека не умеет работать с С++, но есть достойный аналог - Для просмотра ссылки Войдиили Зарегистрируйся.
В этой статье попробуем разобраться, какие еще есть подходы для работы с языками С/С++ и их аналогами, и также рассмотрим возможность анализа С/С++ исходников языков программирования и их компиляции налету. К тому же ответим на вопрос, а можно ли сделать интеграцию C/C++ в языке программирования Python прямо в скрипте. Подобный подход очень размоет границы между языками программирования, но это очень интересный функционал, который возможно может быть полезным.
Библиотека CFFI
Библиотека для работы с С из языка программирования Python. Написана с использованием Для просмотра ссылки ВойдиЧтобы можно было использовать библиотеку, достаточно ввести вот такую команду:
Код:
pip install cffi
Для примера того, как можно работать с этой библиотекой, проведем уже известный из предыдущей статьи эксперимент. Попробуем вызвать MessageBoxA из системной библиотеки. Вот так будет выглядеть код:
Код:
from cffi import FFI
def main():
ffi=FFI()
ffi.cdef("""
int MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCation, UINT uType);
""")
_user32 = ffi.dlopen("USER32.DLL")
lpText = bytes("Hello from cffi", "utf-8")
lpCaption = bytes("Test cffi", "utf-8")
MB_OK = 1
if _user32.MessageBoxA(ffi.NULL, lpText, lpCation, MB_OK):
print("MessageBox showed!")
if __name__ == "__main__":
main()
Результат выполнения скрипта будет таким:
Код стал проще и лаконичнее, теперь можно просто определять функции, копируя их из документации. Все типы, перечисления больше не нужно определять самостоятельно: всё это добавлено уже самой cffi. Но если очень хочется, то можно сделать это вручную. В коде ниже представлен пример того, как можно с помощью библиотеки cffi сделать структуру и присвоить значения её полям:
Код:
from cffi import FFI
def main():
ffi = FFI()
ffi.cdef("""
typedef struct {
unsigned char one, two;
} test;
""")
testStruct = ffi.new("test[]", 1)
testStruct[0].one = 255
testStruct[0].two = 255
if __name__ == "__main__":
main()
Все работает так же, как если бы мы просто создавали кусочки быстрого и эффективного кода на С. А что же насчет С++? К сожалению, эта библиотека не умеет работать с С++, но есть достойный аналог - Для просмотра ссылки Войди