Позволяет ли Python определить функцию C, которую общая библиотека может вызывать напрямую? ⇐ Python

Программы на Python
Anonymous
Позволяет ли Python определить функцию C, которую общая библиотека может вызывать напрямую?

Сообщение Anonymous »

Я понял, как разрешить Python вызывать функцию из моей общей библиотеки:

Код: Выделить всё

import ctypes

def bar():
return 1337

dll = ctypes.PyDLL("./mod.so")

assert dll.foo(ctypes.c_float(42)) == 42 + 1337
где mod.so может вызвать эту панель Функция Python, как в C:

Код: Выделить всё

int foo(float f) {
PyObject *module = PyImport_ImportModule("main");
PyObject *bar = PyObject_GetAttrString(module, "bar");
PyObject *args = PyTuple_Pack(0);
PyObject *result = PyObject_CallObject(bar, args);
return f + PyLong_AsInt(result);
}
По сути, я ищу способ позволить функции C foo() вызывать функцию в коде Python напрямую, без необходимости использования чего-либо специфичного для Python, например PyObject_CallObject()< /код>. Вот во что я пытаюсь превратить файл C:

Код: Выделить всё

int foo(float f) {
return f + bar();
}
Контекст
Мой язык программирования (см. сообщение в блоге), его компилятор+компоновщик выводит общий mod.so, который должен может использоваться любым языком программирования, а не только Python.
Этот mod.so готово работать для C и C++. , поскольку общая библиотека просто использует инструкцию вызова для вызова функции bar основного исполняемого файла. С другой стороны, Python (и большинство других языков высокого уровня) не позволяют вам напрямую вызывать такую ​​функцию Python. Это имеет смысл, поскольку Python оборачивает примитивные типы C в собственные структуры. Вот почему нам понадобился вызов PyObject_CallObject() в приведенном выше коде.
Я мог бы написать программу, которая заменяет весь вызов
Я могла бы написать программу, которая заменяет весь вызов
code> с цепочкой вызовов PyImport_ImportModule() + PyObject_GetAttrString() + и т. д., но я бы предпочел оставить mod.so в покое по техническим причинам.
Я добился того, что поставил адаптер.c в качестве посредника между кодом Python и mod.so. адаптер.so существует только для того, чтобы предоставить функцию-оболочку bar, которую mod.so может вызывать напрямую, содержащую PyObject_CallObject и т. д. звонки. Примерный код см. в моем предыдущем вопросе о переполнении стека.
Поскольку мой язык программирования уже требует, чтобы разработчик игры документировал API мода в mod_api.json, его можно сгенерировать заново. этот файл адаптера.c автоматически, но в идеале этот шаг вообще не требуется.
Возвращаемся к заголовку сообщения
Позволяет ли Python определить функцию C, которую общая библиотека может вызывать напрямую? Если да, то мне не придется беспокоиться об изменении mod.so или о адаптере.c. Спасибо.


Подробнее здесь: https://stackoverflow.com/questions/790 ... l-directly

Вернуться в «Python»