C代码崩溃尝试通过xmlrpc进行Python远程过程调用

时间:2011-03-30 22:47:17

标签: python c python-extensions

我正在尝试创建用于创建Python xmlrpc客户端的C代码并在xmlrpc服务器上调用方法(我正在考虑将其用作用于挂钩DLL的IPC)。

这是代码......我不打算在引用计数中进行分层,直到它起作用。

#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 个答案:

答案 0 :(得分:1)

set_server_proxy()的末尾,你正在调用Py_Finalize()来破坏解释器,然后你正在调用say_hi(),假定解释器仍然存在。当Python解释器代码尝试引发错误时,PyErr_Occurred()函数会获得指向当前线程状态的指针,即NULL;它取消引用它,这会产生段错误。

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");