Сбой кода C при попытке вызова удаленной процедуры Python через xmlrpc

Я пытаюсь создать код C, который создает клиент Python xmlrpc и вызывает методы на сервере xmlrpc (я думаю об использовании этого в качестве IPC для подключаемой DLL).

Вот код... Я не собираюсь подсчитывать ссылки, пока он не заработает.

#include <Python.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

static PyObject *xmlrpc_server_proxy = NULL;
static PyObject *set_server_proxy(void);
static void say_hi(void);

int main()
{
    xmlrpc_server_proxy = set_server_proxy();
    say_hi();
    return 0;
}

static PyObject *
set_server_proxy()
{
        PyObject *xmlrpc_client_mod, *xmlrpc_server_proxy_class, *location, *args;
        PyObject *result;
        Py_Initialize();
        xmlrpc_client_mod = PyImport_ImportModule("xmlrpc.client");
        xmlrpc_server_proxy_class = PyObject_GetAttrString(xmlrpc_client_mod, "ServerProxy");
        location = PyUnicode_FromString("http://127.0.0.1:8000/");
        args = Py_BuildValue("(O)", location);
        result = PyObject_CallObject(xmlrpc_server_proxy_class, args);
        Py_Finalize();
        return result;
}

static void say_hi()
{
    PyObject_CallMethod(xmlrpc_server_proxy, "say_hi", "()");
}

Я подтвердил, что мой сервер Python xmlrpc работает нормально при вызове с другого прокси-сервера Python. Когда я пытаюсь запустить вышеуказанный исполняемый файл, он падает на PyObject_CallMethod(), Зачем?

1 ответ

Решение

Ближе к концу set_server_proxy() ты звонишь Py_Finalize() который уничтожает переводчика, и впоследствии вы звоните say_hi() который предполагает, что переводчик все еще существует. Когда код интерпретатора Python пытается вызвать ошибку, PyErr_Occurred() функция получает указатель на текущее состояние потока, которое NULL; это разыменовывает это, и это генерирует segfault.

Переместите вызовы инициализации интерпретатора в main() функция:

int main()
{
    Py_Initialize();
    xmlrpc_server_proxy = set_server_proxy();
    say_hi();
    Py_Finalize();
    return 0;
}

Во-вторых, если вы пытаетесь использовать стандарт Python xmlrpclib.ServerProxy вам может понадобиться изменить ваш импорт на:

xmlrpc_client_mod = PyImport_ImportModule("xmlrpclib");
Другие вопросы по тегам