我得到;分段错误“;在python的cython扩展中。我怎样才能解决这个问题?

我得到;分段错误“;在python的cython扩展中。我怎样才能解决这个问题?,python,c++,csv,cython,fstream,Python,C++,Csv,Cython,Fstream,我尝试使用cython代码的示例来读取文件 我将此函数用于: iterator = read_file(my_filename) next(iterator) 在读取大量csv文件后,我得到“分段错误(内核转储)”。这个函数“read_file”以与python的标准open(filename,'rb')相同的方式读取文件,但速度要快得多。我还尝试了C++扩展,使用这样的代码: #include <iostream> #include <fstream> #includ

我尝试使用cython代码的示例来读取文件

我将此函数用于:

iterator = read_file(my_filename)
next(iterator)
在读取大量csv文件后,我得到“分段错误(内核转储)”。这个函数“read_file”以与python的标准open(filename,'rb')相同的方式读取文件,但速度要快得多。我还尝试了C++扩展,使用这样的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

std::vector<std::string> readFile(std::string fileName)
{
    std::string line;
    std::vector<std::string> fileStrings;
    std::ifstream myfile(fileName.c_str());

    if(!myfile)
    {
        std::cout<<"Error opening output file"<< std::endl;
        return fileStrings;
    }
    while (std::getline(myfile, line))
    {
        if(line.empty()) continue;
        std::istringstream is(line);
        fileStrings.push_back(is.str());
    }
    return fileStrings;
}
这种方式似乎并不等同于标准python的读取,因为在读取csv(带有非标准符号的东西)的过程中,我还有很多额外的错误。
所以问题是:在cython中读取文件的正确方法是什么,它可以作为纯python中的标准读取接口?为什么会出现“分段错误”?

使用
-g-Wall
编译cython扩展名。如果可能的话,用它们编译Python。好的,我会尝试通过添加额外的编译参数来编译setup.py,但是它有什么帮助呢?然后使用调试器(例如,
gdb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

std::vector<std::string> readFile(std::string fileName)
{
    std::string line;
    std::vector<std::string> fileStrings;
    std::ifstream myfile(fileName.c_str());

    if(!myfile)
    {
        std::cout<<"Error opening output file"<< std::endl;
        return fileStrings;
    }
    while (std::getline(myfile, line))
    {
        if(line.empty()) continue;
        std::istringstream is(line);
        fileStrings.push_back(is.str());
    }
    return fileStrings;
}
from cython.operator cimport dereference, preincrement
cdef extern from "read_file.h":
    vector[string] readFile(string user_name) nogil

def readFileIterator(string fileName):
    file_lines_list=[]
    fileLines = readFile(fileName)
    iterator = fileLines.begin()
    while iterator != fileLines.end():
        file_lines_list.append(dereference(iterator))
        preincrement(iterator)
    return iter(file_lines_list)