我是用cython在c++中使用python函数,而c++函数本身又调用了一个c++函数,一切都编译得很好,但在最后一步却出现了错误。Segmentation fault (core dumped)
当运行输出文件时,我知道要找到错误是很困难的,但有人能帮帮我吗?
#include <iostream>
#include "Python.h"
#include "./plugins/strat_plugin.h" //cython generated header file
int main(int argc, char *argv[])
{
PyRun_SimpleString("import sys\n" "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)
这个命令可以很好地编译,产生头和c文件。cython -2 strat_plugin.pyx
产生头和c文件
strat.h。
#pragma once
#include <iostream>
#include <list>
long long sum(std::list<int> &);
strat.h: strategy.cpp
使用namespace 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代码超过了一个int在 while
循环),并改变 PyInit_strat_plugin
到 initstrat_plugin
它的工作原理对我来说很好。