当从同一个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; haha1&#34;和&#34;哈哈2&#34;打印。但是,如果我取消注释 main.c中的行。我会得到第一个&#34; haha1&#34;打印和段默认。
在我看来,当从同一模块调用cython函数时,模块初始化只能发生一次。我想知道cython是否按照这种方式设计。如果是这样,那么推理是什么?
更多信息:
其他一些想法:
有人可能认为我们可以初始化所有模块并开始使用它。在我的应用程序中,我只需要在初始化阶段调用一些cython函数。后来,我不需要它们,所以我想清理它。此外,每个模块都有自己的初始化。他们可能会也可能不会调用cython函数。如果cython是这样设计的,那么我只能想到两种方式: 1.让python一直运行直到应用程序结束 2.继续跟踪每个cython函数调用,每个模块/客户端代码需要跟踪函数所属的cython模块以及模块是否已初始化。
由于