2012-03-12 23 views
5

Python dizelerinin bir python listesini null sonlandırılmış char**'a nasıl dönüştürebilirim, böylece bunu harici C işlevine iletebilirim?Cython - karakter dizisini char listesine dönüştürme **

Ben:

struct saferun_task: 
    saferun_jail *jail 
    saferun_limits *limits 

    char **argv 
    int stdin_fd 
    int stdout_fd 
    int stderr_fd 

int saferun_run(saferun_inst *inst, saferun_task *task, saferun_stat *stat) 

ben saferun_task.argv

Nasıl atayabileceğin şeye ('./a.out', 'param1', 'param2') gibi bir şey dönüştürmek istediğiniz cdef extern bloğunda? Cython Dokümanlar

+1

https://groups.google.com/forum/?fromgroups#!searchin/cython-users/users/char**/cython-users/users5/dtOV1QwITA/bxL1AtiALkwJ –

+0

Olası çoğaltması [Hızlı dize dizisi - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

cevap

5

:

char* PyString_AsString (PyObject *string) 

dizesinin içeriğinin boş sonlandırılmış temsilini döndürür. işaretçisi, bir kopya değil, dizginin dahili belleğini ifade eder. numaralı veri hiçbir şekilde değiştirilmemelidir. Tahsis edilmemelidir.

Bir Cython derleyici kurulum ve kullanışlı atm yok (daha sonra bu çalıştırabilir ve kontrol edebilirsiniz) ama, şuna benzer kodunda sonuçları olmalıdır: işaretçi stringBuf artık

from libc.stdlib cimport malloc, free 

cdef char **string_buf = malloc(len(pystr_list) * sizeof(char*)) 

for i in range(len(pystr_list)): 
    string_buf[i] = PyString_AsString(pystr_list[i]) 

# Do stuff with string_buf as a char** 
# ... 

free(string_buf) 

olduğunu Herhangi bir dizeyi kopyalamadan orijinal verilerinize char ** - dizeleri const char * (docs'dan) olarak ele alındığından, her dizedeki verileri düzenlememeniz gerekir. Dizeleri işlemek zorunda kalmanız gerekiyorsa, verileri kaydetmeniz veya Python'da çöpe atmayla ilgilenmediğiniz yeni nesneler yapmanız gerekir. Ancak, bir dizi diziniz olduğundan, onları düzenlediğinizden şüpheliyim.

İlgili konular