从c ++调用两个相同模块的cython函数

时间:2016-09-19 10:21:37

标签: python c++ cython

当从同一个cython模块调用cython函数时,我遇到了一个奇怪的问题。这是一个简单的例子:

twocythonfunctions.pyx:

from scipy import signal
import numpy as np
from libcpp.vector cimport vector
from libcpp.string cimport string

cdef public hello1() :
    print('haha1')

cdef public hello2() :
    print('haha2')

的main.c

#include <iostream>
#include <Python.h>
#include "twocythonfunctions.h"

void hello_wrapper1()
{
    Py_Initialize();
    PyInit_twocythonfunctions();
    hello1();
    Py_Finalize();
}

void hello_wrapper2()
{
    Py_Initialize();
    //PyInit_twocythonfunctions();
    hello2();
    Py_Finalize();
}


int main()
{
    hello_wrapper1();
    hello_wrapper2();
    return 1;
}

生成文件

all:
    cython -3 --cplus twocythonfunctions.pyx
    g++ -g -O2 -std=c++11 -fpic -c twocythonfunctions.cpp -o twocythonfunctions.o `python3-config --includes`
    g++ -g -O2 -std=c++11 -fpic -c main.c -o main.o `python3-config --includes`
    g++ -g -O2 -std=c++11 -o example main.o twocythonfunctions.o `python3-config --ldflags`

clean:
    rm -f example twocythonfunction.{c,h} *.o

编译并运行上面的代码:我得到了&#34; haha​​1&#34;和&#34;哈哈2&#34;打印。但是,如果我取消注释 main.c中的行。我会得到第一个&#34; haha​​1&#34;打印和段默认。

在我看来,当从同一模块调用cython函数时,模块初始化只能发生一次。我想知道cython是否按照这种方式设计。如果是这样,那么推理是什么?

更多信息:

  1. 我在MacOSX上运行
  2. 我的cython是0.24。
  3. 我的python是3.5.1
  4. 其他一些想法:

    有人可能认为我们可以初始化所有模块并开始使用它。在我的应用程序中,我只需要在初始化阶段调用一些cython函数。后来,我不需要它们,所以我想清理它。此外,每个模块都有自己的初始化。他们可能会也可能不会调用cython函数。如果cython是这样设计的,那么我只能想到两种方式:    1.让python一直运行直到应用程序结束    2.继续跟踪每个cython函数调用,每个模块/客户端代码需要跟踪函数所属的cython模块以及模块是否已初始化。

    由于

0 个答案:

没有答案