使用Swig在Python中嵌入Python时如何初始化全局指针?

时间:2014-09-02 13:08:46

标签: python c pointers embed swig

我在c中有一个“路由器之类”项目,处理不同的数据包。它已经工作正常了。 现在我将它扩展为在python中处理一些新数据包。我使用Swig来包装一些现有的函数(比如将数据包发送到较低层)。

当我唤起包装函数时会出现问题:

//router.c
Queue_t *queue;
....
//processPkt.c
int process_new_in_c(pkt)
{
    if(pkt.new == True)
        Py_init();
        init_MyModule();
        import_Module(process.py);
        process_new_in_py(pkt);            
        Py_finalize();
     ....
}

//processNew.py
def process_new_in_py(pkt)
    ...
    MyModule.sendToLowerLayer(pkt);

//lowerlayer.c->wrapped into MyModule
int sendToLowerLayer(pkt)
{
    ...
    sendToQueue(queque, pkt);
}

队列是外出数据包的缓冲区,在程序启动时会初始化。

然而,当我调用包装函数MyModule.sendToLowerLayer(queue, pkt)时,程序崩溃了。我确保它应该在初始化时收到一个Null队列指针。

  1. 队列在调用process_new_in_c
  2. 之前在C中定义
  3. 我只将sendToLowerLayer()暴露给不需要队列参数的Python。但它稍后调用了sendToQueue()
  4. C-> Py->包装C在包装C中,全局队列成为空指针。
  5. 这个问题让我疯狂T_T

    我的.i文件是:

    %module MyModule
    %inline% {
        #include ...
        int sendToLowerLayer(pkt);
    %}
    

    对于懒惰的代码很抱歉,我只是害怕原始代码太多而无法阅读。

    我有process_new_in_c调用process_new_in_py,并且在python函数中我调用了一个包装的C函数send_to_lower_layerqueue已在C中声明并初始化,但是当我调用包装函数send_to_lower_layer时,queue似乎从未初始化。

    我认为问题可能是: 在调用init_MyModule()时,它声明了一个fake global variable,如:MyModule.queue,它永远不会被初始化。 所以当代码执行到sendToQueue(queue, pkt)时,它实际上是用MyModule.queue而不是队列调用(在C部分内有一个有效值)

0 个答案:

没有答案