cython结构,从python到cython的字符串

cython结构,从python到cython的字符串,python,c,cython,Python,C,Cython,我想像下面那样将python对象转换为cython结构,但它没有将simres[1]的值赋给resulta[x].cpt1 cdef struct resultaStructure: double score char **cpt1 simRes = [1.0, ['http://bioontology.org/projects/ontologies/fma/fmaOwlDlComponent_2_0#Abdomen', 'Abdomen']] cdef x = 0 cde

我想像下面那样将python对象转换为cython结构,但它没有将simres[1]的值赋给resulta[x].cpt1

cdef struct resultaStructure:
    double score
    char **cpt1

simRes = [1.0,
['http://bioontology.org/projects/ontologies/fma/fmaOwlDlComponent_2_0#Abdomen', 
'Abdomen']]
cdef x = 0 
cdef resultaStructure *resulta = <resultaStructure *> malloc(sizeof(resultaStructure)*labelsSourceTaille)

resulta[x].score = simRes[0]
print("score : ",resulta[0].score)

resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)
print('2')
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
print('3')
resulta[x].cpt1[1] = <char*> malloc (sizeof (char)*simRes[1][1].__len__()+1)
print('4')
resulta[x].cpt1[0] = <char*> simRes[1][0]
print('5')
resulta[x].cpt1[1] = <char*>  simRes[1][1]
print('6')

print("cpt1 0 : ",resulta[0].cpt1[0])
print("cpt1 1 : ",resulta[0].cpt1[1])
cdef结构结果结构:
双倍得分
字符**cpt1
simRes=[1.0,
['http://bioontology.org/projects/ontologies/fma/fmaOwlDlComponent_2_0#Abdomen', 
“腹部”]]
cdef x=0
cdef resultaStructure*resulta=malloc(sizeof(resultaStructure)*LabelSourceTaille)
结果[x]。分数=simRes[0]
打印(“分数:,结果[0]。分数)
结果[x].cpt1=malloc(sizeof(char**)*2)
打印('2')
结果[x].cpt1[0]=malloc(字符大小)*simRes[1][0]。\uu len\uu()
打印('3')
结果[x].cpt1[1]=malloc(字符大小)*simRes[1][1]。\uu len\uu()
打印('4')
结果[x].cpt1[0]=simRes[1][0]
打印('5')
结果[x].cpt1[1]=simRes[1][1]
打印('6')
打印(“cpt1 0:,结果[0]。cpt1[0])
打印(“cpt1 1:,结果[0]。cpt1[1])
结果如下

(“分数:”,1.0)

二,

三,

四,


解决方案是在赋值之前对python字符串进行编码,如下所示:

str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1
print('5')
str2 = simRes[1][1].encode('UTF-8')
resulta[x].cpt1[1] = <char*> str2
str1=simRes[1][0]。编码('UTF-8')
结果[x].cpt1[0]=str1
打印('5')
str2=simRes[1][1]。编码('UTF-8')
结果[x].cpt1[1]=str2

问题和OP答案中的代码存在严重问题,可能导致程序长期崩溃

1) (更好的是,如果长度始终为
2
,则在结构定义中分配
char*cpt1[2]
,而不需要
malloc
它。)

这不太可能导致真正的问题,因为所有指针的大小都相同,但仍然是错误的

2) (真正的问题a部分)

(另外,你还记得
释放
你所有
malloc
ed的内存,对吗?

谢谢你,你对我说得很清楚。这是一个我花了一些时间才解决的问题,但正如你所说,它可能会因为你提到的问题而崩溃。对于第二点,指向python内存是否可以,用于无gil进程?因为我的目的是在没有gil的情况下使用cython并行。在没有gil的情况下指向python内存是可以的。在释放GIL之前,确保线程持有对内存的引用。您需要小心确保其他线程在查看内存时不会更改完全相同的内存,否则可能会得到令人困惑的结果。(但是,让多个线程更改同一数组的不同元素是正常且常见的)。字符串应该是不可变的,所以它们不应该被更改,这应该是安全的。
resulta[x].cpt1 = <char**> malloc (sizeof (char**)*2)
resulta[x].cpt1 = <char*> malloc (sizeof (char*)*2)
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*simRes[1][0].__len__()+1)
# ...
resulta[x].cpt1[0] = <char*>some_python_string
str1 = simRes[1][0].encode('UTF-8')
resulta[x].cpt1[0] = <char*> str1
resulta[x].cpt1[0] = <char*> malloc (sizeof (char)*len(simRes[1][0])+1)
strcpy(resulta[x].cpt1[0],str1)