我对Cython比较陌生,如果这个问题看起来非常基本,那就道歉了。
有一个可并行化的正则表达式匹配块,我想用Cython和nogil
运行它。为避免使用Python对象,我的计划是导入regex.h
。
以下导入段编译:
cdef extern from "regex.h" nogil:
ctypedef struct regoff_t
ctypedef struct regex_t
ctypedef struct regmatch_t
int regcomp(regex_t* preg, const char* regex, int cflags)
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)
def matchPatterns(str pageContent, str regex):
cdef set matchingPatterns = set()
return matchingPatterns
但是只要我使用regex_t
或其任何功能,我就会收到错误:contentMatchPatternCython.pyx:10:16: Variable type 'regex_t' is incomplete
如果我删除空的ctypedef
,则代码无法编译,因为regex_t
未定义。显然,我认为/希望有一种方法可以在Cython中没有重复结构定义。
我正在使用Python 2.7.2和Cython 0.22。任何指针都会被感激地收到。
答案 0 :(得分:2)
http://docs.cython.org/src/userguide/external_C_code.html
直接引用文档:
如果头文件声明了一个大结构而你只想使用一个 很少有成员,你只需要申报你感兴趣的成员 保留其余部分不会造成任何伤害,因为C编译器 将使用头文件中的完整定义。
在某些情况下,您可能不需要任何struct的成员 在哪种情况下,您可以将pass放入struct的主体中 声明,例如:
struct A {}
如果您匹配的是阅读typedef struct {} B
或function find_student_by_firstname($firstname){
global $con;
$safe_firstname = prep($firstname);
$sql = "SELECT * ";
$sql .= "FROM studeprofile ";
$sql .= "WHERE FirstName = '{$safe_firstname}' ";
$sql .= "LIMIT 1";
$student_set = mysqli_query($con, $sql);
confirm_query($student_set);
if($student = mysqli_fetch_assoc($student_set)){
return $student;
} else {
return null;
}
}
function find_student_by_lastname($lastname){
global $con;
$safe_lastname = prep($lastname);
$sql = "SELECT * ";
$sql .= "FROM studeprofile ";
$sql .= "WHERE LastName = '{$safe_lastname}' ";
$sql .= "LIMIT 1";
$student_set = mysqli_query($con, $sql);
confirm_query($student_set);
if($student = mysqli_fetch_assoc($student_set)){
return $student;
} else {
return null;
}
}
的C代码,则使用以下哪项内容。