我得到;分段错误“;在python的cython扩展中。我怎样才能解决这个问题?
我尝试使用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
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)