Подтвердить что ты не робот

Python bindings, как это работает?

Я изучаю python. Мне интересно, какие привязки python. Может кто-нибудь объяснить, как возможно, что вы можете иметь доступ к C-библиотекам из Python.

4b9b3361

Ответ 1

Существует несколько способов вызова кода, написанного на языке C на Python.

Во-первых, в стандартной библиотеке есть модуль ctypes. Он позволяет загружать библиотеку динамической компоновки (DLL в Windows, разделяемые библиотеки .so в Linux) и вызывать функции из этих библиотек непосредственно из Python. Такие библиотеки обычно записываются в C.

Во-вторых, в случае CPython существует API Python/C. Его можно использовать двумя основными способами:

Библиотека динамической компоновки может быть записана на языке C таким образом, что CPython будет рассматривать ее как модуль (вы сможете импортировать ее в свои программы Python). API Python/C позволяет библиотеке определять функции, написанные на C, но все же вызываемые из Python. API очень эффективен и предоставляет функции для управления всеми типами данных Python и доступа к внутренним интерфейсам интерпретатора.

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

"Привязки" реализованы либо как чистая библиотека Python с использованием ctypes, либо как библиотека динамической компоновки с использованием API Python/C. Второй вариант иногда используется с такими инструментами, как SWIG, которые облегчают задачу, заботясь о генерации кода котельной плиты или Boost.Python, который предоставляет API С++ поверх API Python/C, что упрощает взаимодействие с кодом на С++.

Далее читайте: Интерфейс внешних функций

Ответ 2

Ответ прост, интерпретатор python (CPython) написан на C, и он может динамически вызывать другие библиотеки C, ваш C-модуль расширения или встроенный C-код можно легко вызвать из любого другого кода C.

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

Для простого примера рассмотрим, что вы создаете программу под названием mython, которая может загружать любую общую библиотеку и пытается вызвать функцию run например.

lib = dlopen("mylib.so", RTLD_LAZY);
func = dlsym(lib, "run");
(*func)();

Таким образом, вы загрузили модуль и назвали его код, CPython делает это, но более сложным образом, обеспечивая более совершенные интерфейсы и объекты, а также есть другие сложности, связанные с управлением памятью, управлением потоками и т.д.

Таким образом, платформа реализации Python должна соответствовать языку, на котором он расширяется, например. CPython не расширяется в Java, но реализация Java Python под названием Jython может быть расширена в Java и аналогичной реализации .NET IronPython можно расширить на .Net языках.