Позволяет ли 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 напрямую, без необходимости использования PyObject_CallObject().
Контекст
Это нормально, но мой язык программирования (см. сообщение в блоге) его компилятор+компоновщик выводит общий 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. Adaptor.so существует только для того, чтобы предоставить функцию-оболочку bar, которую mod.so может вызывать напрямую. Примерный код см. в моем предыдущем вопросе о переполнении стека. Однако это не идеальный вариант, поскольку разработчику игры теперь придется постоянно добавлять новые привязки к адаптеру.c.
Вернемся к заголовку сообщенияПозволяет ли Python определить функцию C, которую общая библиотека может вызывать напрямую? Если да, то мне не придется беспокоиться об изменении mod.so или о адаптере.c. Спасибо.

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

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