В документации для написания CPython расширений можно найти следующий код:
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
Как мы видим, эта функция во внешнем C расширение может использовать функцию, определенную (я думаю) внутри основного CPython исходного кода интерпретатора: PyArg_ParseTuple
.
Если бы мы просто создавали исходный файл расширения напрямую (он же *) 1009 *, et c.), Даже при включении необходимого заголовка <Python.h>
компоновщик будет жаловаться на undefined reference to PyArg_ParseTupe
.
Так как же построены CPython расширения, в некотором роде что позволяет им свободно ссылаться на функции из кодовой базы CPython?
Созданы ли расширения вместе с исходным кодом фактического интерпретатора? Связаны ли они с объектными файлами реального интерпретатора? Другой подход?
Пожалуйста, обратитесь к подходу, относящемуся к Windows. Дополнительная информация о Linux также приветствуется.