Код: Выделить всё
import ctypes
def bar():
return 1337
dll = ctypes.PyDLL("./mod.so")
assert dll.foo(ctypes.c_float(42)) == 42 + 1337
Код: Выделить всё
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);
}
Код: Выделить всё
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