2012-03-12 20 views
5

Come posso convertire un elenco python di stringhe python in uno char** con terminazione null in modo che possa passarlo alla funzione C esterna?Cython - conversione dell'elenco di stringhe in char **

ho:

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) 

in cdef blocco extern

voglio convertire qualcosa come ('./a.out', 'param1', 'param2') a qualcosa che posso assegnare a saferun_task.argv

Come?

+1

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

+0

Possibile duplicato di [Fast string array - Cython] (http://stackoverflow.com/questions/17511309/fast-string-array-cython) – Claudiu

risposta

5

Dalla documentazione Cython:

char* PyString_AsString (PyObject *string) 

restituisce una rappresentazione terminazione Null del contenuto della stringa. Il puntatore si riferisce al buffer interno della stringa, non una copia. I dati non devono essere modificati in alcun modo. Non deve essere disallocato.

Non ho una messa a punto Cython compilatore e maneggevole atm (posso correre in seguito e verificare), ma, questo dovrebbe risultati in codice che sembra qualcosa di simile:

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) 

Lo stringBuf puntatore è ora un char ** ai tuoi dati originali senza copiare stringhe, anche se non dovresti modificare i dati in ogni stringa dato che le stringhe devono essere trattate come const char * (dai documenti). Se hai bisogno di manipolare le stringhe dovrai memorizzare i dati o creare nuovi oggetti che non ti interessano di cestinare in Python - sebbene tu abbia una tupla di stringhe dubito che tu li stia modificando.