我正在使用cython在c++中使用python函数,它本身调用一个c++函数,一切都编译得很好,但在最后一步出现了错误:Segmentation fault (core dumped)
在运行out文件时,我知道很难找到错误,但有人能帮我吗:
#include <iostream>
#include "Python.h"
#include "./plugins/strat_plugin.h" //cython generated header file
int main(int argc, char *argv[])
{
PyRun_SimpleString("import sysn" "import os");
PyRun_SimpleString("sys.path.append( os.path.dirname(os.getcwd()) +'/plugins/')");
int status=PyImport_AppendInittab("start_plugin", &initstrat_plugin);
if(status==-1){
std::cout<<"error in appendinit"<<"n";
return -1;//error
}
Py_Initialize();
PyObject *module = PyImport_ImportModule("strat_plugin");
if(module==NULL){
PyErr_Print();
Py_Finalize();
std::cout<<"error in import"<<"n";
return -1;//error
}
long long ans=0;
std::list<int> a;
ans=gen_fibonacci(a,1,100); //this is the cython function
std::cout<<"ans: "<<ans;
std::cout<<"n";
}
编译:
g++-8 ./plugins/strat_plugin.c helper.cpp $(python-config --libs) $(python-config --includes) $(python-config --cflags)
strat_plugin.pyx文件:
from libcpp.list cimport list
from test import test_sum
cdef public long long gen_fibonacci(list[int] &l,int ind,int n):
num = 3
t1 = 0
t2 = 1
nextTerm = 0
i=1
if ind==1:
l.push_back(0)
l.push_back(1)
i=3
if ind==2:
l.push_back(1)
i=2
while i<n:
nextTerm=t1+t2
t1=t2
t2=nextTerm
if num>=ind:
i=i+1
l.push_back(nextTerm)
num=num+1
return test_sum(l)
这与命令cython -2 strat_plugin.pyx
生成的头和c文件配合得很好。
strat.h:
#pragma once
#include <iostream>
#include <list>
long long sum(std::list<int> &);
策略.cpp
包括";strat.h">
使用命名空间std;
long long sum(list<int> &l)
{
long long s =0;
for(list<int>::const_iterator i = l.begin(); i != l.end(); i++)
s+= *i ;
return s;
}
strat.pyx:
from libcpp.list cimport list
cdef extern from "strat.h":
long long sum(list[int] &)
def test_sum(list[int] l):
return sum(l)
setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("test", ["strat.pyx", "strategy.cpp"], language='c++',)]
setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules)
编译使用:
python3 setup.py build_ext --inplace
更多相关信息:我试着用gdb调试它,得到了这个:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a2569b in PyImport_GetModuleDict () from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
我真的不明白错误,有人能指出哪里出了问题吗?
删除test_sum
(因为我没有代码(,忽略溢出错误(您的python代码超过了while
循环中的int范围(,并将PyInit_strat_plugin
更改为initstrat_plugin
,对我来说效果很好。